一.反射
1.反射的作用
1.获取一个类里面的所有信息,获取到了之后,在执行其他的业务逻辑。
2.结合配置文件,动态的创建对象并调用方法。
2.获取类的字节码文件对象的方法
1.源代码阶段
Class.forName("全类名");
全类名(包名+类名)
最为常用。
2.类加载阶段
类名.class
更多的是当做参数进行传递。
3.运行阶段
对象.getClass();
有需要获取字节码文件对象的类的对象的时候,才可以使用。
3.获取到字节码文件对象后的常用操作
获取到字节码文件对象后可以用该对象进行的操作
1.获取类中的字段(成员变量)(Field)
可获取成员变量的权限修饰符、变量名、变量的类型、对变量进行赋值/取值
1.getFields();返回所有公共成员变量对象的数组
2.getDeclaredFields();返回所有成员变量对象的数组
3.getField();返回单个公共成员变量对象
4.getDeclaredField();返回单个成员变量对象
5.获取到成员变量对象后,可以通过该对象获取成员变量的修饰符、变量名、数据类型
getModifiers();getName();getType();
6.获取到的成员变量.get(类的对象);得到该成员变量中存的值
7.获取到的成员变量.set(类的对象,"修改的值");得到该成员变量中存的值
8.setAccessible(true);表示临时取消权限的校验(暴力反射)
2.构造方法(Constructor)
获取修饰符、构造方法的名称、形参、创建对象
1.getConstructors();返回所有公共构造方法对象的数组
2.getDeclaredConstructors();返回所有构造方法对象的数组
3.getConstructor();返回单个公共构造方法对象
4.getDeclaredConstructor();返回单个构造方法对象
获取单个构造时方法参数列表里面写入与构造方法相应的数据类型的字节码对象,格式为(数据类型.class)
5.getParameters();获取构造方法的参数
6.newInstance();传入与获取到的构造方法参数列表数据类型相同的参数,返回一个类的对象
7.setAccessible(true);表示临时取消权限的校验(暴力反射)
3.成员方法(Method)
获取修饰符、方法名、形参、返回值、抛出的异常、运行方法
1.getMethods();返回所有公共成员方法对象的数组,包括继承的方法
2.getDeclaredMethods();返回所有成员方法对象的数组,不包括继承的方法
3.getMethod();返回单个公共成员方法对象
4.getDeclaredMethod();返回单个成员方法对象
5.通过上面方法得到的类字节码文件对象
成员方法对象.invoke(方法的调用者,需要传入的参数) 以此来运行获取到的方法
4.代码演示
//运行主类
package homeWork.reflectDemo1;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class NewInstanceTest {
public static void main(String[] args) throws ClassNotFoundException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException {
Class aClass = Class.forName("homeWork.reflectDemo1.Student");
Constructor[] constructors = aClass.getConstructors();
System.out.println("*******************获取构造器********************");
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
System.out.println("*******************获取成员方法********************");
Class studentClass = Student.class;
Method[] declaredMethods = studentClass.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) {
System.out.println(declaredMethod);
}
System.out.println("*******************获取属性********************");
Student student = new Student();
Class aClass1 = student.getClass();
Field[] declaredFields = aClass1.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
int modifiers = declaredField.getModifiers();
System.out.println("属性的修饰符="+modifiers);
}
System.out.println("***************调用无参与有参构造方法****************");
Constructor constructor = aClass.getConstructor();
Object o = constructor.newInstance();
System.out.println(o);
Constructor constructor1 = aClass.getConstructor(String.class,int.class);
Object o1 = constructor1.newInstance("zhangsan",18);
System.out.println(o1);
}
}
//Student类
package homeWork.reflectDemo1;
public class Student {
private String name;
private int age;
public Student(){}
public Student(String name){
this.name = name;
}
public Student(String name,int age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}