反射机制:
JAVA反射机制是在运行状态中,对于任意一个实体类(class文件),都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
在Java的反射中我们首先要了解class类 以及反射所涉及的api反射的api包是:java.lang.reflect包
Class类:
可能瞬间就想到了反射,没错!Class
一般就是和反射配套使用的,因为我们向Class
提供一个类或一个类的类名,Class
就可以提供我们很多信息,比如属性/方法/修饰符/构造器/类名等等。然后我们就可以进一步进行反射。
通过Class来获取对象:
- 根据类名:类名.class
- 根据对象:对象.getClass()
- 根据全限定类名:Class.forName(全限定类名)
// 获取Person的class对象的方式 Person person = new Person (); System.out.println (person.getClass ()); System.out.println (Person.class); System.out.println (Class.forName ("com.wuzhilong.Person")); // 获取全限定类名 System.out.println (person.getClass ().getName ()); //获取类名 System.out.println (person.getClass ().getSimpleName ()); // 实例化 System.out.println (person.getClass ().newInstance ());
获取类中的构造方法以及构造方法中的参数
Class personClass = Class.forName ("com.wuzhilong.Person"); //获取所有的构造方法 Constructor[] constructors = personClass.getConstructors (); //取消安全性检查,设置后才可以使用private修饰的构造方法,也可以单独对某个构造函数进行设置 Constructor.setAccessible (constructors,true); for (Constructor constructor:constructors){ // 获取构造方法中的参数 Class<?> parmenterTypeClass[] = constructor.getParameterTypes (); for (Class<?> classtype:parmenterTypeClass){ //参数类型 System.out.println (classtype.getName ()); } }
获取类中的属性
//获取字节码文件 Class classPerson = Class.forName ("com.wuzhilong.Person"); //获取实例对象 Person person =(Person) classPerson.newInstance (); //获取共有的成员变量 Field field = classPerson.getField ("name"); field.set (person,"xiaoming"); System.out.println (field.get (person)); //获取类中的所有的成员变量 Field field1 = classPerson.getDeclaredField ("pwd"); // 设置私有属性的可见权限 field1.setAccessible (true); // 操作成员变量:给属性赋值 field1.set (person,"123456"); // 获取属性值 System.out.println (field1.get (person));
获取方法执行
//获取字节码文件 Class classPerson = Class.forName ("com.wuzhilong.Person"); //获取实例对象 Person person =(Person) classPerson.newInstance (); //获取方法 :第一个参数:方法名 第二个参数:方法的参数 Method method = classPerson.getMethod ("show",null); //调用方法: method.invoke (obj,object....args) 第一个参数:方法的对象 //第二个参数:方法的实际参数值,没有则不填 method.invoke (person);