JAVA反射与C#反射之比较
2011-04-21 05:14
218 查看
JAVA反射与C#反射之比较
反射提供的主要功能:
1.在运行时判断任意一个对象所属的类
2.在运行时构造一个类的对象
3.在运行时判断一个类所具有的属性和方法
4.在运行时调用一个对象的方法
实现反射的过程:
1.加载一个类
2.根据这个类动态创建一个对象
3. 动态得到这个对象的方法
4.调用这个对象的方法
try {
//加载类的三种方法
// Class<?> classType = Class.forName("com.ls.reflecttest.Person");
// Class<?> classType = Person.class;
Class<?> classType = Person.getClass();
//创建对象,第一种方法只能调用默认的构造方法,第二种方法可以调用带参的构造方法
// Object object = classType.newInstance();
Object object = classType.getConstructor(new Class[] {int.class, String.class, int.class}).newInstance(new Object[] {12, "wdw", 12});
//动态得到该对象的方法
Method sayHelloMethod = classType.getMethod("sayHello", new Class[]{String.class});
sayHelloMethod.invoke(object, new Object[] {"wdw"});
//动态得到所有属性,
Field[] filds = classType.getDeclaredFields();
for(int i=0; i < filds.length; i++) {
System.out.println(filds[i].getName());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
此外还有很多方法:得到所有方法getDeclaredMethods(), getField()等等
//得到类型
Type type = Type.GetType("ReflectTest.Person");
//得到该类型所在的程序集
Assembly assembly = Assembly.GetAssembly(type);//类似于JAVA中的加载
//C#中可以直接加载文件
//Assembly assembly = Assembly.LoadFile("文件路径"); //JAVA中没有这种方法
//创建对象
Object o = assembly.CreateInstance("ReflectTest.Person");
//动态获得方法
MethodInfo method = type.GetMethod("ToString");
//调用方法
Console.WriteLine(method.Invoke(o, new object[] { }));
一.什么是反射
在运行时环境,能否根据一个类的名字,来得到这个类的属性和方法?对于任何一个运行时的对象能否动态调用这个对象的方法?答案是可以的。这种动态的获取类的信息以及动态调用一个对象的方法的机制叫做反射。反射提供的主要功能:
1.在运行时判断任意一个对象所属的类
2.在运行时构造一个类的对象
3.在运行时判断一个类所具有的属性和方法
4.在运行时调用一个对象的方法
实现反射的过程:
1.加载一个类
2.根据这个类动态创建一个对象
3. 动态得到这个对象的方法
4.调用这个对象的方法
二.JAVA中的反射
需要导入包:import java.lang.reflect;try {
//加载类的三种方法
// Class<?> classType = Class.forName("com.ls.reflecttest.Person");
// Class<?> classType = Person.class;
Class<?> classType = Person.getClass();
//创建对象,第一种方法只能调用默认的构造方法,第二种方法可以调用带参的构造方法
// Object object = classType.newInstance();
Object object = classType.getConstructor(new Class[] {int.class, String.class, int.class}).newInstance(new Object[] {12, "wdw", 12});
//动态得到该对象的方法
Method sayHelloMethod = classType.getMethod("sayHello", new Class[]{String.class});
sayHelloMethod.invoke(object, new Object[] {"wdw"});
//动态得到所有属性,
Field[] filds = classType.getDeclaredFields();
for(int i=0; i < filds.length; i++) {
System.out.println(filds[i].getName());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
此外还有很多方法:得到所有方法getDeclaredMethods(), getField()等等
三.C#中的反射
感觉跟JAVA中的反射机制是一样的,首先引入命名空间:using System.reflection;//得到类型
Type type = Type.GetType("ReflectTest.Person");
//得到该类型所在的程序集
Assembly assembly = Assembly.GetAssembly(type);//类似于JAVA中的加载
//C#中可以直接加载文件
//Assembly assembly = Assembly.LoadFile("文件路径"); //JAVA中没有这种方法
//创建对象
Object o = assembly.CreateInstance("ReflectTest.Person");
//动态获得方法
MethodInfo method = type.GetMethod("ToString");
//调用方法
Console.WriteLine(method.Invoke(o, new object[] { }));
四.总结
原来各种语言都是相同的,反射机制也是一样的只不过换了几个类,几个方法名而已,慢慢体会其实不单单是反射机制,两种语言有很多相同之处,思想都是一样的,继续努力,加油!相关文章推荐
- 【JAVA与C#比较】反射
- java与c#的反射性能比较
- java和c#的反射比较(转)
- JAVA C# C/C++之比较学:初始化顺序
- C#和Java访问修饰符的比较
- Java和C#中String直接赋值与使用new创建(==与equals进行比较)的区别
- C#和Java在多态情况下对成员访问的比较
- Java与C#个人之比较
- substring()在JAVA,C#,SQL中的区别 --- 比较下
- 【JAVA与C#比较】集合
- Atitit.跨语言反射api 兼容性提升与增强 java c#。Net php js
- Java与C#执行效率之不科学比较
- c语言下的通用数据库接口(之sqlite消化,模拟c#,java的反射)
- java:java中的Socket 和 C#中的socket 比较
- C#和java求圆周率的近似值的比较
- C#、Java之比较
- java和c#的优缺点、编译器和解释器的比较
- C# 反射性能比较
- Java (J2SE 5.0) and C# 比较
- C\C#\Java\Python 基本数据类型比较