匿名对象和object的转换

本文介绍了一种在C#中将匿名对象存入List<object>并进行取出后转换的方法,包括使用动态类型处理、类型转换及反射技术的具体实现。
有时候经常用到需要把一个匿名对象存入session或List<object>或其他容器中,可是取出来的时候变成object了,不太方便使用。
下面是一种转换方式:
[csharp] 
    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); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值