一.什么是反射机制?
JAVA反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
二.反射有关的API有哪些?
Class,Method,Field,Constructor,Annotation,Package,Interface等;
获取一个类的Class对象,从Class对象中可以获得类字段信息,方法,构造函数,注解,父类和接口等信息.还可以执行方法,获取属性值等.
三.如何使用反射获取类信息?
获取一个类的Class对象,从Class对象中可以get类字段信息,方法,构造函数,注解,父类和接口等信息.还可以执行方法,获取属性值等.
下面函数列出了通过Class可以获得的信息.
1: /**
2: * getMethods(Class.class,"get"); 反射获取clss类的包含前缀pre的方法3: *4: * @param clazz5: * @param pre6: */7: public static void getMethods(Class<?> clazz, String pre) {8: Method[] ms = clazz.getDeclaredMethods();9: for (Method m : ms) {
10: if (m.getName().contains(pre)) {
11: System.out.println(m);12: }13: }14: }
四.如何动态实例化对象?
有两种方式:
1.通过Class的newInstance()方法实例化,类必须包含参构造方法.
2.通过Class选择一个Constructor,执行Constructor的newInstance()实例化;
1: /**
2: * 使用构造函数需要预先知道有哪些构造函数1: /**
3: * @throws Exception4: */5: public static void createObject2() throws Exception {6: Class<?> clazz=Class.forName("java.io.BufferedInputStream");
7: Constructor ctor=clazz.getConstructor(InputStream.class);
8: InputStream in=InstanceObjectDemo.class.getClassLoader().getResourceAsStream("InstanceObjectDemo.java");9: BufferedInputStream obj=(BufferedInputStream) ctor.newInstance(in);10: System.out.println(obj);11: obj.close();12: }13: /**
14: * 动态实例化对象15: * @param clazz16: */17: public static Object createObject(String className){18: Object obj=null;
19: try {
20: obj=Class.forName(className).newInstance();21: } catch (Exception e) {
22: e.printStackTrace();23: }24: return obj;
25: }
五.动态方法调用
使用Method的invoke()方法执行public的方法,对于私有方法,要先调用setAccessible(true)取消访问权限检查.
1: /**
2: * 执行方法invoke()3: * @throws Exception4: */5: public static void excMethon() throws Exception{6:7: String str="12abcde";
8: Class clazz=str.getClass();9: Method m=clazz.getMethod("substring", int.class);10: String result=(String) m.invoke(str, 2);11: System.out.println(result);12: }
六.如何访问成员变量值?
1: /**
2: * 直接获取字段值,需要取消访问权限[setAccessible(true)]
3: * 类Point2中有x,y两个整型字段4: * @throws Exception5: */6: public static void accessField()throws Exception{7: Point2 p=new Point2(2,3);
8: Class clazz=p.getClass();9: Field fx=clazz.getDeclaredField("x");
10: Field fy=clazz.getDeclaredField("y");
11:12: fx.setAccessible(true);
13: fy.setAccessible(true);
14:15: System.out.println(fx.get(p)+","+fy.get(p));
16: fx.set(p, 20);17:18: fy.set(p, 30);19: System.out.println(p);20:21: }
七.数组反射工具类java.lang.reflect.Array
1: /**