一、概述:
所谓的反射就是动态的获取类信息以及动态的调用对象,在java运行环境中,对于任何一个对象,都可以通过反射获取类的信息,知道这个类的属性和方法,实现动态的声明对象,并能够调用它的任意的方法和属性;
动态的声明对象,所谓得动态声明对象,就是通过反射和xml,借助于类的全类名来生成新对象,将需要声明的对象类的全类名放到xml文档当中,通过DOM4J文件将这个文档解析出来,存入到集合当中,将集合返回到主程序,在主程序中根据实际的需要提取出不同的全类名,然后通过Class.forName()方法你拿到类的所有信息,然后借助于newInstance这个方法生成新的对象,拿到方法Method,通过invoke方法实现方法。
注意:生成类,拿到方法都是通过生成的类的信息进行的。
二、拿到Class信息的三种方法:
1. 对象名.getClass();
2. 类名.class;
3. Class.forName("全类名");
三、拿到类的父类:
Class<?> sc =clazz.getSuperclass();
常用方法:
拿到类的所有的内容:
Class<?> clazz = Class.forName(className)
新建对象:
Object obj = clazz.newInstance()
拿到类的方法:
Method method = clazz.getMethod("service")
执行类的方法:
method.invoke(obj)。
- 通过反射来获取方法并执行:
1拿到class类:
Class clazz = Class.forName
("cn.sxt.refect.entity.Student");
2.创建对象:
Object object = clazz.newInstance();
3.获取方法:
Method[] methods = clazz.getDeclaredMethods();
4.遍历拿到所有的方法:
for (Method m : methods)
5.获取对应的方法:
Method m1 = clazz.getDeclaredMethod(“方法名”,参数);
6.执行方法:
m1.invoke(object, "哈哈哈");
clazz.getMotheds和clazz.getDeclaredMethods的区别:
get.Motheds返回某个类所有的公共方法(public),包括继承类的公共方法,当然也包括他实现的接口类的方法。
clazz.getDeclaredMethods:对象表示的类和接口所有的方法,包括:公共(public)、保护(protectde)、默认(defluat)和私有(private)访问权限。但不包括继承的方法,当然也包括它所实现的接口的方法。
总结:
拿到方法的的属性,方法的参数,方法的
(二):通过反射调用构造器:
1.拿到类的所有的信息:
Class<?> class1 = Class.forName ("cn.sxt.refect.entity.Student");
2.拿到构造器集合:
1>拿到公共的:Constructor<?>[] con = clazz.getConstructors();
2>拿到私有的:Constructor<?>[] con1 = clazz.getDeclaredConstructors();
3.遍历构造器:for (Constructor c : con1)
4.拿到特定的构造器:
Constructor<?> constructor = clazz.getDeclaredConstructor(参数);
5.构建新的对象:
Object object = new constructor.newInstance();
6.拿到构造方法的名字:
String name = c.getName;
7.拿到构造方法的权限:
Int modifier = c.getModifiers();
8.将私有的构造器转换为可识别的:
dec.setAccessible(true);
注意:这里拿到的权限只是一个int类型的数字,在Java里面权限被用普通的int数字来代替,要想拿到一个可读的文字,就必须在经过一步的转换 Modifier.toString() 进行一步转换即可。
Modifier.toString(modifier);
总结:通过反射拿到类参数,可以拿到构造方法的名字,构造方法的权限,构造方法参数的权限,要注意拿到不同权限的构造方法,通过参数拿到不同的构造器,通过构造器来建立不同的对象,拿到可读性的权限的说明,拿到私有的构造器以后并不能立刻使用,要经过一步将构造器转换为可见的才可以,如果构造出来的对象需要调用本类的变量和方法,还需要进行一步向下转型才行,因为新建的对象都是Object类型的。
(三)通过成员变量获取成员变量:
1.拿到类的信息:
Class<?> clazz = Class.forName("java.lang.String");
2.拿到全部的公共属性:
Field[] fields = clazz.getFields();
3.遍历属性:for (Field f : fields);
4.拿到私有属性:
Field[] f2 = clazz.getDeclaredFields();
5.遍历属性:
for (Field f : f2)
6.拿到单独的属性:
Field field = clazz.getDeclaredField("hash");
7.拿到属名字:
field.getName();
8.拿到属性的权限:
Modifier.toString(field.getModifiers())
9.拿到属性的类型:
field.getType()
总结:
通过反射的Field的诸多方法,可以拿到类的集合,可以拿到类的公共的属性,可以拿到类的私有属性,可以拿到类的,可以拿到类属性的集合,可以拿到单独的属性,这些单独的属性可以知道属性的名字,属性的类型,属性的权限。