反射:
(1) 反射就是把Java类中的各种成分映射成相应的java类。
(2) 如何得到各个字节码对应的实例对象(Class类型):
a) 类名.class;
b) 对象.getClass(); //内存中以存在字节码。
c) Class.forName(“java.util.Date”);//当类内存中未存在字节码.返回与带有给定字符串名的类相关联的 Class 对象。
(3)九个预定义的Class实例对象:八个基本类型和void类型。
构造方法的反射(常用的方法):
Constructor类:代表构造方法的类。
Constructor con = String.class.getConstructor(StringBuffer.class);
//表示选择哪个构造方法。
con.newInstance(new StringBuffer(“abcd”));
//表示根据具体的参数,创建一个新实例。
常用的方法:
Constructor getConstructor(Class<?>... par)
Constructor[] getConstructors()
Constructor getDeclaredConstructor(Class<?>... para)
Constructor[] getDeclaredConstructors()
根据上面的对象创建传入指定参数的实例 newInstance(xxx,xxx,xxx)
成员变量的反射(常用的方法):
Field getField(String name)
Field[] getFields()
Field getDeclaredField(String name)
Field[] getDeclaredFields()
根据上面的对象获取传入指定对象参数的值 对像.get(obj);
如果变量是私有的,则可以将其设置成可访问形式,以便于读取。方法为:setAccessible(boolean flag)
改变某个对象上的值,方法为:set(Object obj, Object value)
成员方法的反射:
Method xxx = Class.forName(“java.lang.String”).getMethod(“方法名字”, Class类型参数);
//得到类中的某一个方法.
xxx.invoke(对象,参数);
//Method类对象调用invoke方法对指定对象,传入特定参数的方法。如果invoke方法的第一个参数为null,则调用静态方法。第二个参数如果是数组类型的话,就需要将数组再次装入Object[]中,这是因为JDK1.4没有可变参数,而是用数组形式导致的原因。new Object[]{new String[] {“1”,”2”,”3”}} 或 (Object)new String[] {“1”,”2”,”3”}这种方式是伪装成对象而不是数组了,所以不会拆包。
其他方法(常用的方法):
Method getMethod(String name, Class<?>... parameterTypes)
Method[] getMethods()
Method getDeclaredMethod(String name, Class<?>... parameterTypes)
Method[] getDeclaredMethods()
|