Java,反射机制

今天,学习了一些Java反射机制,简单记录一下。

 

按我的理解,就是在运行时,运态的获取对象相关的一些信息:

  • 对象的“类”型、哪些成员变量、哪些方法、成员变量的值、新建一个某个类的对象,等等;

目前,我能想到的一些应用场景:

  • 各种对象(无论子类、父类、对接口的任一种实现)都扔进来,显式调用其方法等,不关心其内部具体实现。“扔进来,调,一视同仁,去个性化”
  • 给一个对象,“制造仿品”,即新建类型的对象(对象数组等);
  • 突破那个类对对象/方法的访问权限控制,破掉封装性(可访问private变量、方法),很黄很暴力;

 

【1】获得“类”型

Class<?> classType = Class.forName(“java.lang.String”);

Class<?> classType = MyTest.class;

Class<?> classType = object.getClass();

 

【2】构造函数,构造带参数的类的对象;

Constructor cons = classType.getConstructor(new Class[]{});

Object o = cons.newInstance(new Object[]{});

不带参数的,可以直接这样写:

Object o = classType.newInstance();

 

课外小拓展(新建某个类的带参数的对象):

 

Class[] argsClass = new Class[args.length]; //根据Object[] args建类

 

for(int i=0;i<args.length;i++){

 

  argsClass[i]  = args[i].getClass();

 

}

Constructor cons = classType.getConstructor(argsClass); //获取带有这此参数类型的构造函数

cons.newInstance(args);//传入对象,新建对象

 

 

【3】成员变量

Field[] fields = classType.getDeclaredFields();

Field field = classType.getDeclaredField(o);

field.get(o);

fileld.get(classType);//类的静态成员哦

field.getName();

field.getType();

 

【4】方法

Method[] methods = classType.getDeclaredMethods();

Method method = classType.getMethod(“add”,new Class[]{int.class, int.class});

methods.setAccessible(true);//太暴力了

 

Object result = method.invoke(o, new Object[]{1,2});

Object result = method.invoke(null, new Object[]{1,2});//执行静态方法

 

【5】动态数组

Object arr = Array.newInstance(classType, 10);

Array.set(arr, 1, “hello”);

String str = (String)Array.get(arr, 1);

 

int[] dims = new int[]{5, 10, 15};

Object arr = Array.newInstance(Integer.TYPE, 3);

Object arrObj = Array.get(arr, 3);//获得一个第[3]个二维数组[10][15]

Object arrObj2 = Array.get(arrayObj, 5);//获得一个第[5]个一组数组[15]

Array.setInt(arrayObj2, 10, 37);//设定第10个值是37

 

int[][][] arrayCast = (int[][][])arr;

System.out.println(arrayCast[3][5][10]);

 

【6】是否为某个类的实例

someclass.isInstance(obj);

 

posted @ 2012-04-09 20:19  技术草根女  Views(598)  Comments(0Edit  收藏  举报