反射
- 动态获取类的字节码文件,并对其成员进行抽象(就是想通过字节码文件直接创建对象)
- 字节码文件
- .class本身是对象
- 表示字节码文件的属性的属性
private Field field;
- 表示字节码文件的普通方法的属性
private Method method;
- 表示字节码文件的构造方法的属性
private Constructor con;
- 反射的过程
1.获取字节码文件对象
Class.forName("包名+类名");
2.通过字节码文件对象获取对应的实例对象
① 无参构造
public static void fun1(Class<?> cls) throws .....{
Object object=cls.newInstance();
}
② 有参构造
public static void fun1(Class<?> cls) throws .....{
Constructor constructor=cls.getConstructor(String.class,int.class); //可变参数
//constructor是有参构造方法的对象
Object object=constructor.newInstance("zdsg",20);
}
3.给属性赋值(通过从属性中提取出来的类–Field)
Field field1=cls.getDeclaredField("name");
field1.setAccessible(true);
field1.set(object,"zdsg");
System.out.println(field1.get(object));
4.调用方法(通过从方法中提取出来的类–Method)
① 调用非静态无参
Method method=cls.getMethod("show");
method.invoke(object);
②调用非静态有参
Constructor constructor=cls.getConstructor(String.class,int.class);
Object object=constructor.newInstance("zdsg",20);
Method method2=cls.getMethod("zdsg",int.class);
method2.invoke(object,"110");
③调用静态有参
Method method3=cls.getMethod("run",int.class);
method4.invoke(null,11);