JAVA反射与C#反射之比较

来源:互联网 发布:国威电话交换机编程 编辑:程序博客网 时间:2024/04/29 17:48

  JAVA反射与C#反射之比较

一.什么是反射

      在运行时环境,能否根据一个类的名字,来得到这个类的属性和方法?对于任何一个运行时的对象能否动态调用这个对象的方法?答案是可以的。这种动态的获取类的信息以及动态调用一个对象的方法的机制叫做反射。

      反射提供的主要功能:

      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[] { }));

四.总结

    原来各种语言都是相同的,反射机制也是一样的只不过换了几个类,几个方法名而已,慢慢体会其实不单单是反射机制,两种语言有很多相同之处,思想都是一样的,继续努力,加油!

原创粉丝点击