1.概述&应用场景
a.概述:JAVA反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态获取的信息及动态调用对象的方法的功能称为JAVA语言的反射机制。
b.应用场景
图示:
2.Class对象
概述:在JAVA中,每个class都有相应的Class对象。也就是说,当我们编写一个类,编译完成后,在生成的 .class文件中,就会产生一个Class对象,用于表示这个类的类型信息。
图示:
3.获取Class对象的三种方式
代码示例:
package test;
import java.text.DateFormat.Field;
/*
* 要想对字节码文件进行解剖,必须要有字节码文件对象
* 如何获取字节码文件对象呢?
*/
public class ReflectDemo {
public static void main(String[] args) throws ClassNotFoundException {
// getClassObject_1();
// getClassObjects_2();
getClassObject_3();
}
//方式1.Object类中的getClass()方法
//这种方式必须要明确具体的类,并创建对象
public static void getClassObject_1() {
Person p = new Person(50,"xiaoqiang");
Class clazz = p.getClass();
Person p1 = new Person(30,"lili");
Class clazz1 = p1.getClass();
System.out.println(clazz==clazz1);
}
//方式2.任何数据类型都具备一个静态的属性.class来获取其对应的Class对象
//相对简单,但是还是要明确具体用到类中的静态成员
public static void getClassObject_2() {
Class clazz = Person.class;
Class clazz1 = Person.class;
System.out.println(clazz==clazz1);
}
//方式3.只要通过给定的类的 字符串名称就可以获取该类,更为扩展
//可以用Class类中的方法完成 forName()
//这种方式只要有名称就可,更方便,扩展性更强
public static void getClassObject_3() throws ClassNotFoundException {
String className = "test.Person";
Class clazz = Class.forName(className);
System.out.println(clazz);
}
}
4.获取Class中的构造函数
代码示例:
public static void createNewObject() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
String name = "test.Person";
//找寻该名称类文件,并加载进内存,并产生Class对象
Class clazz = Class.forName(name);
//调用newInstance()方法产生该类的对象
// Object obj = clazz.newInstance();
//获取到了指定的构造函数对象
Constructor constructor = clazz.getConstructor(String.class,int.class);
//通过该构造器对象的newInstance方法进行对象的初始化
Object obj = constructor.newInstance(30,"xiaoming");
}
5.获取Class中的字段
代码示例:
Class clazz = Class.forName("test.Person");
Field field = clazz.getField("age");//只能获取公有的
field = clazz.getDeclaredField("age");//只能获取本类,但包含私有
//对私有字段的访问取消权限检查,强制访问
field.setAccessible(true);
Object obj = clazz.newInstance();
Object o = field.get(obj);
System.out.println(o);
System.out.println(field);
6.获取Class中的方法
代码示例:
Class clazz = Class.forName("test.Person");
//获取指定Class中的公共函数
Method[] methods = clazz.getMethods();
//只获取本类中所有方法,包含私有
methods = clazz.getDeclaredMethods();
for(Method method : methods) {
System.out.println(method);
}
//获取空参数一般方法
Method method = clazz.getMethod("show",null);
// Object obj = clazz.newInstance();
Constructor constructor = clazz.getConstructor(String.class,int.class);
Object obj = constructor.newInstance("小明",37);
method.invoke(obj, null);
//获取带参数的一般方法
Method method1 = clazz.getMethod("paramMethod",String.class,int.class);
Object obj1 = clazz.newInstance();
method.invoke(obj,"小强",20);