一、反射的概述
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
关于java.lang.Class类的理解:
1、类的加载过程:
程序经过javac.exe命令以后,会生成一个或多个字节码文件(.Class结尾)
接着使用java.exe命令对某个字节码文件进行解释运行,相当于将某个字节码文件加载到内存中,此过程就成为类的加载,加载到内存中的类,我们称之为运行时类,此运行时类就作为一个Class的一个实例
换句话说,Class的实例就对应一个运行时类
加载到内存中的运行时类,会缓存一定的时间,在此时间之内,我们可以通过不同的方式来获取此运行时类
获取Class实例的方式:
方式一:调用运行时类的属性:.Class
Class stuClass2 = Student.class;
System.out.println(stuClass);
方式二:通过运行时类的对象,调用getClass
Student stu1 = new Student(); //产生一个Student对象,一个Class对象。
Class stuClass = stu1.getClass();//获取Class对象
System.out.println(stuClass);
方式三:调用Class的静态方法
Class stuClass3 = Class.forName("fanshe.Student");//注意此字符串必须是带包名的类路径,包名.类名
System.out.println(stuClass3 == stuClass2);
.newInstance():创建运行时类的对象,内部调用了运行时类的空参的构造器
要想此方法正常的创建运行时类的对象,要求:
- 运行时类必须提供空参的构造器
- 空参的构造器的访问权限得够,通常设置为public
获取属性结构:
getFields():获取当前运行时类及其父类中声明为public访问权限的属性
getDeclaredFields():获取当前运行时类中声明的所有属性
getMethods():获取当前运行时类及其所有父类中声明为public访问权限的方法
getDeclaredMethods():获取当前运行时类中声明的所有方法,
如何操作运行时类中的指定属性:
Class clazz = Person.class;
创建运行时类的对象
Person p = clazz.newInstance();
Field name = clazz.getDeclaredField(“name”);
保证当前属性是可以被访问的
Name.setAccessible(true);
获取,设置指定对象的此属性值
Name.set(p,”Tom”)
如何操作运行时类中的指定方法:(非静态)
Class clazz = Person.class;
创建运行时类的对象
Person p = clazz.newInstance();
获取指定的某个方法
Method show = clazz.getDeclaredMethod(“show”,String.class)
Show.setAccessible(true);
//invoke:参数1:方法的调用者,参数2:给方法形参赋的实参
Show.invoke(p,”CHN”);
如何操作运行时类中的指定方法:(静态)
Method show = clazz.getDeclaredMethod(“show”)
Show.invoke(null)
将invoke方法的第一个参数设为null即可!
获取指定的构造器:
Constructor constructor = clazz.getDeclaredConstructor(String.class)
constructor.setAccessible(true);
Person p = constructor.newInstance();