匿名对象和object的转换

有时候经常用到需要把一个匿名对象存入session或List<object>或其他容器中,可是取出来的时候变成object了,不太方便使用。

下面是一种转换方式:

    class Program
    {
        static void Main(string[] args)
        {
            List<object> olist = new List<object>();
            olist.Add(new { Name = "Hauk", Age = 22 });
            olist.Add(new { Name = "Emily", Age = 22 });


            //使用动态类型
            foreach (dynamic item in olist)
            {
                Console.WriteLine(item.Name);
            }


            //做类型转换
            var obj = ChangeType(olist[0], new { Name = "", Age = 0 });
            Console.WriteLine(obj.Name);


            //直接反射
            Console.WriteLine(olist[0].GetType().GetProperty("Name").GetValue(olist[0]).ToString());
        }


        static T ChangeType<T>(object obj, T t)
        {
            return (T)obj;
        }
    }


<think>好的,用户之前询问了Class.forName方法其他类的forName方法之间的区别,现在他们想了解Class对象Object对象的区别。我需要先回顾之前的回答,确保这次的内容保持一致,并且补充新的知识点。 首先,用户可能对Java的反射机制不太熟悉,或者正在学习Java的基础知识,特别是类对象的关系。他们可能想深入理解这两个概念在JVM中的具体表现。 接下来,我需要明确Class对象Object对象的定义。Class对象是每个类在JVM中的元数据表示,而Object对象是类的实例。要区分它们的创建方式、作用以及使用方法。例如,Class对象由JVM在类加载时创建,而Object对象通过new关键字或反射实例化。 然后,考虑用户可能的误区,比如混淆Class对象类的实例。需要强调Class对象描述的是类本身的信息,而Object对象是具体的实例。可能需要举例说明,比如String.class是Class对象,而new String()是Object对象。 还要注意用户可能关心的使用场景,比如反射、动态加载类、获取类信息等。需要提到Class对象在反射中的核心作用,而Object对象是实际操作的数据载体。 另外,用户可能对JVM层面的机制感兴趣,可以简要提到方法区存储Class对象,堆内存存储Object对象,这样帮助理解内存结构。 需要检查是否有遗漏的重要点,比如Class对象的单例性,每个类只有一个Class对象,而Object对象可以有多个实例。同时,提到获取Class对象的不同方法,如.class语法、getClass()Class.forName()。 最后,确保语言通俗易懂,结构清晰,分点说明,可能用表格对比两者的区别。避免使用过于专业的术语,但必要时需准确。回答中要包括定义、创建时机、内存位置、作用、获取方式示例代码,这样用户能全面理解。</think>以下是关于Java中`Class对象`与`Object对象`的对比说明: --- ### 一、核心概念解析 #### 1. **Class对象** ```java // 获取Class对象的三种方式 Class<String> cls1 = String.class; // 类字面量 Class<?> cls2 = "Hello".getClass(); // 实例对象获取 Class<?> cls3 = Class.forName("java.lang.String"); // 反射加载 ``` **本质**: - JVM为每个加载的类创建的**元数据对象**(包含类结构信息) - 存储在**方法区(元空间)**中 - 每个类在JVM生命周期内**只有唯一一个**Class对象 **核心作用**: - 反射操作的入口(获取构造器/方法/字段) - 存储类元信息(继承结构/注解/泛型等) - 类加载验证的基准 #### 2. **Object对象** ```java // 创建Object对象的两种方式 Object obj1 = new String("实例"); // 常规实例化 Object obj2 = cls1.newInstance(); // 反射创建 ``` **本质**: - 根据类模板创建的**具体实例** - 存储在**堆内存**中 - 同一个类可以创建**无数个**Object对象 **核心作用**: - 承载具体数据状态 - 执行实际业务逻辑 - 实现面向对象的多态特性 --- ### 二、关键差异对比表 | 维度 | Class对象 | Object对象 | |---------------------|-----------------------------------|----------------------------------| | **存储位置** | 方法区(元空间) | 堆内存 | | **数量特性** | 单例(每个类1个) | 多例(可无限创建) | | **创建时机** | 类加载时由JVM自动生成 | 通过`new`或反射显式创建 | | **内存消耗** | 固定大小(存储类元信息) | 可变大小(根据实例数据变化) | | **主要用途** | 反射/类信息查询/动态代理 | 业务数据处理/方法调用 | | **访问方式** | `.class`语法/`getClass()`/`Class.forName()` | `new`操作符/反射实例化 | | **序列化能力** | 不可序列化 | 可序列化(实现Serializable接口) | --- ### 三、内存结构示例 ```java // 假设存在Person类 Person p1 = new Person("张三"); Person p2 = new Person("李四"); // JVM内存布局: // 方法区 -> Person.class (Class对象) // 堆内存 -> p1对象实例、p2对象实例 ``` ![JVM内存示意图](https://via.placeholder.com/600x200?text=方法区存Class对象+堆存Object实例) --- ### 四、特殊关系说明 1. **类型校验**: ```java // 判断对象类型 p1.getClass() == Person.class // 返回true ``` 2. **单例模式验证**: ```java Singleton s1 = Singleton.getInstance(); Singleton s2 = Singleton.getInstance(); s1.getClass() == s2.getClass() // 永远为true(共享同一个Class对象) ``` 3. **数组类型**: ```java int[] arr = new int[10]; System.out.println(arr.getClass()); // 输出"class [I" System.out.println(arr.getClass().getComponentType()); // 输出int.class ``` --- ### 五、常见误区 1. **混淆`.class`与`getClass()`**: ```java // 父类引用指向子类对象 Object obj = new ArrayList<>(); obj.getClass(); // 返回ArrayList.class obj.getClass() == List.class // 返回false ``` 2. **基本类型的Class对象**: ```java System.out.println(int.class); // 输出"int" System.out.println(Integer.TYPE); // 同样输出"int" ``` 3. **匿名内部类的Class对象**: ```java Runnable r = new Runnable() { public void run() {} }; System.out.println(r.getClass().getName()); // 输出"MainClass$1" ``` --- ### 六、最佳实践 1. **Class对象缓存**: ```java // 对频繁使用的Class对象进行缓存 private static final Class<?> STRING_CLASS = String.class; ``` 2. **类型安全校验**: ```java // 避免直接强制类型转换 if(obj.getClass() == TargetClass.class) { TargetClass tc = (TargetClass)obj; } ``` 3. **动态代理应用**: ```java // 基于Class对象创建代理实例 MyInterface proxy = (MyInterface) Proxy.newProxyInstance( MyInterface.class.getClassLoader(), new Class<?>[] { MyInterface.class }, invocationHandler); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值