java反射机制是在运行状态中,对于任意一个类,都能够知道这个类所有的属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
底层是怎么执行的:Java虚拟机根据字节码文件,将.class文件编译成一个对象,通过这个字节码文件对象获取当前类下面的属性,方法,构造方法。
1.获取class对象的方法
- Class.forName(“全类名”);将字节码文件加载进内存,返回class对象。
多用于配置文件,将类名定义在配置文件中。读取文件,加载类。
- 类名.class;通过类名的属性class获取。
多用于参数的传递。
- 对象.getClass();getClass()方法在Object类中定义着。
多用于对象的获取字节码的方式。
重点:同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,所以不论通过哪一种方式获取的class对象都是同一个。
2.class对象的功能
1.获取成员变量
Field[] getFields();获取所有public修饰的成员变量
Field getField(String name);获取指定名称的public修饰的成员变量
Field[] getDeclaredFields();获取所有的成员变量,不考虑修饰符
Field getDeclaredField(String name);获取指定名称的成员变量,不考虑修饰符。
2.获取构造方法
Constructor<?>[] getConstructors();获取所有public修饰的构造方法
Constructor<T>[] getConstructor(类<?>... parameterTypes);
获取一个public修饰的构造方法
传的参数是 数据类型的Class对象 你参数是啥类型的我就获取所对应的构造方法。(例String.class)
Constructor<?>[] getDeclaredConstructors();
获取所有的构造方法,不考虑修饰符
Constructor<T>[] getDeclaredConstructor(类<?>... parameterTypes);
获取一个构造方法,不考虑修饰符。
3.获取成员方法
Method[] getMethods();获取所有public修饰的成员方法和父类公开的方法。
Method getMethod(String name, 类<?>... parameterTypes);
获取一个public修饰的成员方法
第一个参数是要获取的方法的名字,第二个参数是要获取的方法的参数的数据类型的Class对象(例String.class)。
Method[] getDeclaredMethods();
获取当前.class文件下面的public修饰的方法,父类继承的方法获取不了。Method getDeclaredMethod(String name, 类<?>... parameterTypes);
获取一个成员方法,不考虑修饰符。
4.获取类名
String getName();
(1).获取Field(成员变量)之后的操作:
- 设置值
void set(Object obj, Object value);
obj:属性进行赋值,得知道这属性在哪个类下面(用反射实例化对象)
value:属性要设置的值
- 获取值
get(Object obj);
- 忽略访问权限修饰符的安全检查
setAccessible(true);暴力反射
(2)获取Constructor(构造方法)之后的操作
创建对象:
Object newInstance(Object... initargs);
(3)获取Method(方法对象)之后的操作:
执行方法:
Object invoke(Object obj,Object... args);使用方法对象调用本身
Obj:告诉我当前方法在哪个对象下面(用反射实例化对象)
//第二个参数 是方法的参数
获取方法名称:
String getName;获取方法名