什么是反射:反射是获取类信息的能力,能够分析类信息
一、反射的工作生命周期1.java源文件 由javac编译成java.class字节码文件
2. 再加载到方法区中
3.由方法区在堆中创建对象
4.卸载
二、如何获取class对象1..Class.forName("全类名"):将字节码文件加载进内存,返回class对象
(多用于配置文件,将类名定义在配置文件当中,读取文件,加载类)
2.类名.class: 通过类名的class获取
(多用于参数的传递)
3.对象.getClass() :getClass()方法在object类当中定义着
(多用于对象获取字节码的方式)
三、获取Field成员变量1.Field[ ] getFields()获取所有public修饰的成员变量(用Field[ ]数组接收)
2.Field getField() 获取某一个公有的变量
3.Field [ ] getDeclaredFields():获取所有的成员变量,不考虑修饰符
4.Field getDeclaredField( ) 获取某一个变量,不考虑修饰符
忽略访问权限修饰符的安全检查
d.setAccessible(true);//暴力反射
四、Constructor访问构造方法因为构造器的方法名称是相同的,不同的是参数列表,所以我们根据不同的参数列表来找到构造器
//因为构造器的方法名称是相同的,不同的是参数列表,所以我们可以根据不同的参数列表来找到构造器
Constructor constructor = personClass.getConstructor(String.class,int.class);
System.out.println(constructor);
//创建对象
Object perObject = constructor.newInstance("张三",20);
System.out.println(perObject);
System.out.println("-------------------------------");
Constructor constructor1 = personClass.getConstructor();
System.out.println(constructor1);
//创建对象
Object perObject1 = constructor1.newInstance();
System.out.println(perObject1);
System.out.println("-------------------------------");
Object o = personClass.newInstance();
System.out.println(o);
}
五、Method:方法对象
1.获取指定名称的方法,方法无参
//获取指定名称的方法,方法无参
Method eat_method = personClass.getMethod("eat");
//执行方法
Person person =new Person();
eat_method.invoke(person);
2.获取指定名称的方法,方法有参
//获取指定名称的方法,方法有参
Method eat_method1 = personClass.getMethod("eat",String.class);
//执行方法
eat_method1.invoke(person,"饭");
3.获取所有public修饰的方法
//获取所有public修饰的方法
Method[] methods = personClass.getMethods();
for (Method method : methods) {
System.out.println(method);
//获取方法的名称
String name = method.getName();
System.out.println(name);
}



