一、含义:
Java反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法和属性
这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制
动态获取类中信息,就是Java反射
可以理解为对类的解剖
反射必须要有接口和配置文件两大元素。
二、 字节码文件对象
想要对一个类文件进行解剖,只要获取到该类字节码文件对象即可
|-- 用于描述字节码的类叫class Class{
提供获取字节码文件中的内容。比如名称,字段,构造函数,一般函数
}
该类就可以获取字节码文件中的所有内容,那么反射,就是依靠该类完成的。
三、获取Class对象的三种方式
package com.FansheReflect; import com.JavaFanShe.Person; /** * @Author wufq * @Date 2020/9/8 16:38 */ public class ReflectDemo { public static void main(String[] args) throws ClassNotFoundException { // getClassobject_1(); // getClassobject_2(); getClassobject_3(); } /* 方式三:通过给定类的字符串名称就可以获取类,更为扩展 可是用Class类中的方法完成。 该方法就是forName 这种方法只需要名称即可,更方便,扩展性更强 * */ public static void getClassobject_3() throws ClassNotFoundException { String className = "com.JavaFanShe.Person";// Class classs = Class.forName(className); //以下片段返回命名为java.lang.Thread的类的运行时Class描述符,所以定义的类字符串是完整的带包名的类名称 System.out.println(classs); } /* * 方式一:获取字节码对象的方式: * 1.object类中的getClass方法 * 想要这种方式,必须要明确具体的类,并创建对象 * 麻烦!!! * */ public static void getClassobject_1(){ Person p = new Person(); Class aClass=p.getClass(); //调用person的缺省构造器 -->Person run... Person p1 = new Person(); Class p1Class= p1.getClass();//调用person的缺省构造器 -->Person run... System.out.println(aClass==p1Class); } /*方式二: * 任何数据类型都具备一个静态的属性.class来获取其对应的class对象 * 相对简单,但是还是要明确用到类中的静态成员 * */ private static void getClassobject_2() { Class classz = Person.class; Class classz1 = Person.class; System.out.println(classz==classz1); } }
四、获取Class中的构造函数
|-- 寻找类名称文件,并加载进内存,生成class对象
|-- 通过getConstructor(Class<?>... parameterTypes)方法获取指定的构造方法,返回Constructor对象
|-- 通过newInstance()方法实现对象的生成
备注:如果调用缺省构造器的话,就不需要获取指定的构造方法,,直接实现方法的生成
package com.FansheReflect; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; /** * @Author wufq * @Date 2020/9/9 15:46 */ public class ReflectDemo01 { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { //creatNewObject_2(); //creatNewObject(); creatNewObject_1(); } public static void creatNewObject(){ //早期初始化对象-->缺省构造器、构造方法调用 com.JavaFanShe.Person p = new com.JavaFanShe.Person(); com.JavaFanShe.Person p1 = new com.JavaFanShe.Person("小强",23); } //现在:通过该名称类文件地址 -->缺省构造器、构造方法调用 public static void creatNewObject_1() throws ClassNotFoundException, IllegalAccessException, InstantiationException { String Naame ="com.JavaFanShe.Person"; //寻找该名称类文件,并加载进内存,并产生class对象 Class classs = Class.forName(Naame); //如何产生对象呢? Object obj =classs.newInstance(); } public static void creatNewObject_2() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException { String Naame ="com.JavaFanShe.Person"; //寻找该名称类文件,并加载进内存,并产生class对象 Class classs = Class.forName(Naame); //获取到了指定对象的构造方法 Constructor con =classs.getConstructor(String.class,int.class); //真实产生对象 Object obj = con.newInstance("小强",22); } } =====执行结果===== Person param run...小强::22 Person run... Person param run...小强::23 Person run...
原文:https://www.cnblogs.com/frankruby/p/13639934.html