反射:
简述:
剖析Java类中的各个组成部分映射成一个个java对象:
涉及到的类:
java.lang.Class类:用于表示一个类的字节码(.class)文件
得到某个(.class)文件对应的Class对象:
类名确定时:类名.class
对象确定时:对象.getClass()
类名和对象不确定时:Class.forName("类全名"),类全名指:包名.类名
成员方法:
Class Class.forName("类全名");通过类名,加载类字节码到内存中,并封装成一个Class对象
Object newInstance();用来调用类的构造方法,创建一个该类对应的对象
例:String obj = (String)Class.forName("java.lang.String").newInstance();
获取普通成员:
Constructor getConstructor(Class clazz,...);获取指定参数列表的构造函数对象
如:获取String(String str);这个构造:
Class.forName("java.lang.String").getConstructor(String.class);
Method getMethod(String methoName,Class clazz,...);获取指定方法名和指定参数列表的成员方法对象
Field getField(String name);获取指定名称的字段对象
获取私有成员:
Constructor getDeclaredConstructor(Class clazz);
Method getDeclaredMethod(String name,Class clazz,...);
Field getDeclaredField(String name);
--设置私有成员可以被访问:
setAccessible(boolean b);
reflect类:
Constructor类:字节码对象的构造方法对象
获取某个字节码对象的所有构造方法:
Constructor[] constructor = 字节码对象.getConstructors();
Constructor[] constructor = 字节码对象.getDeclaredConstructors();
获取指定的构造方法:
Constructor constructor = 字节码对象.getConstructor(参数类型.class,...);
成员方法:
newIncetence(...);构造一个对象
Field类:字节码对象中的成员变量对象
获取字节码对象中所有成员变量对象:
Field[] fields = 字节码对象.getFields();
Field[] fields = 字节码对象.getDeclaredFields();
获取指定的成员变量对象:
Field field = 字节码对象.getField(String fieldName);
Field field = 字节码对象.getDeclaredField(String fieldName);
设置Field变量是否可以访问:
field.setAccessible(boolean b);
在一个类中调用其他类的私有方法是,需要设置,当前类则忽略
Field变量值的读取和设置
field.get(obj);obj是所要获取的字段所在的对象
field.set(obj);obj是所要设置的字段所在的对象
Method类:字节码中成员方法对象
获取字节码对象中所有成员方法对象:
Method[] methods = 字节码对象.getMethods();
Method[] methods = 字节码对象.getDeclaredMethod();
获取指定的成员方法对象:
Method method = 字节码对象.getMethod(String name,参数.class,...);
Method method = 字节码对象.getDeclaredMethod(String name,参数.class,...);
例子:
获取方法:
Method charAt = Class.forName("java.lang.String").getMethod("charAt",int.class);
调用方法:
一般方式:str.charAt(1); 对象.方法名(参数,...);
反射方式:charAt.invoke(str, 1); 方法名.invoke(对象,参数,...);
如果该方法是一个静态方法,对象参数可以写null.
jdk1.4和jdk1.5的invoke方法的区别:
Jdk1.5:public Object invoke(Object obj,Object... args),
Jdk1.4:public Object invoke(Object obj,Object[] args),
即按jdk1.4的语法,需要将一个数组作为参数传递给invoke方法时,
数组中的每个元素分别对应被调用方法中的一个参数,
所以,调用charAt方法的代码也可以用Jdk1.4改写为 charAt.invoke(“str”, new Object[]{1})形式。
主要作用:
多用于框架和组件,写出复用性高的通用程序
|
|