反射机制
反射机制是程序在运行中,获取任意一个类的属性和方法,并且可以调用。以达到动态获取类信息、动态调用对象的方法。
反射将类的各个组成部分封装成其他对象,这就是反射机制。
反射的应用场合
Java 对象在运行时可能会出现两种类型:编译时类型和运行时类型。
编译时的类型由声明对象时用的类型来决定,运行时的类型由实际赋值给对象的类型决定 。
如:Person p=new Student();
其中编译时类型为 Person,运行时类型为 Student。
程序在运行时想要获取 Student 对象的真实信息,就只能依靠运行时信息来发现该对象和类的真实信息,此时就必须使用到反射了
反射 API
Class 类:反射的核心类,可以获取类的属性,方法等信息。
Field 类:Java.lang.reflec 包中的类,表示类的成员变量,可以用来获取和设置类之中的属性值。
Method 类: Java.lang.reflec 包中的类,表示类的方法,它可以用来获取类中的方法信息或者执行方法。
Constructor 类: Java.lang.reflec 包中的类,表示类的构造方法。
// 1 调用某个对象的 getClass()方法 Person p=new Person(); Class clazz=p.getClass(); // 2 调用某个类的 class 属性来获取该类对应的 Class 对象 Class clazz=Person.class; // 3 使用 Class 类中的 forName()静态方法(最安全/性能最好/最常用) Class clazz=Class.forName("类的全路径");
通过 Class 类中的方法获取并查看该类中的方法和属性。
// 获取 Person 类的 Class 对象 Class clazz=Class.forName("reflection.Person"); // 使用.newInstane 方法创建对象 Person p=(Person) clazz.newInstance(); // 获取构造方法创建对象并设置属性 Constructor c=clazz.getDeclaredConstructor(String.class,String.class,int.class); Person p1=(Person) c.newInstance("李四","男",20); //获取 Person 类的所有方法信息 // getMethods(),该方法是获取本类以及父类或者父接口中所有的公共方法(public修饰符修饰的) // getDeclaredMethods(),该方法是获取本类中的所有方法,包括私有的(private、protected、默认以及public)的方法。 Method[] method=clazz.getDeclaredMethods(); for(Method m:method){ System.out.println(m.toString()); // 调用方法 使方法执行 m.invoke(p, 20);//需要两个参数,一个是要调用的对象(获取有反射),一个是实参 } //获取 Person 类的所有成员属性信息 Field[] field=clazz.getDeclaredFields(); for(Field f:field){ System.out.println(f.toString()); } //获取 Person 类的所有构造方法信息 Constructor[] constructor=clazz.getDeclaredConstructors(); for(Constructor c:constructor){ System.out.println(c.toString()); }