一.Java的反射机制概述与场景
JAVA反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态互殴的信息以及动态调用对象的方法的功能称为java语言的反射机制
场景:tomcat中服务器web.xml类文件由反射进行加载
二.反射机制细节&class对象
获得字节码对象的几种方式
方式1:使用对象获得 根据被new的累的名称寻找累的字节码文件,并加载进内存,并创建该字节码文件对选哪个,并接着创建盖子接文件的对应的person对象
Person person = new Person();
Class class1 = person.getClass();
方式2:使用类获得
Class class3 = Person.class;
方式3:使用名称获得
try {
Class<?> forName = Class.forName("Person");
System.out.println(forName);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
三.创建对象
1.newInstance,相当于调用无参构造方法,注意:当无空参构造方法或者对象为private空参构造时,会报错
Object newInstance = forName.newInstance();
2.获取指定的构造函数
Class<?> forName = Class.forName("Person");
Constructor<?> constructor = forName.getConstructor(Integer.class,String.class);
Object obj = constructor.newInstance(1,"小明");
四.获取属性
1.获得公有属性
Class<?> forName = Class.forName("Person");
Constructor<?> constructor = forName.getConstructor(Integer.class,String.class);
Object obj = constructor.newInstance(1,"小明");
Field field = forName.getField("c");
Object object = field.get(obj);
2.获得私有的属性
Class<?> forName = Class.forName("Person");
Constructor<?> constructor = forName.getConstructor(Integer.class,String.class);
Object obj = constructor.newInstance(1,"小明");
Field declaredField = forName.getDeclaredField("a");
declaredField.setAccessible(true);
System.out.println(declaredField.get(obj));
注意:必须要取消权限检查才能访问暴力访问,不建议使用
五.获取方法
1.获得字节对象所有的公有方法名称
Class<?> forName = Class.forName("Person");
Method[] methods = forName.getMethods();
2.调用方法
Class<?> forName = Class.forName("Person");
Method method = forName.getMethod("方法名称",null);
method.invoke("我们的实体类", "参数");