反射技术介绍以及底层逻辑使用

发布于:2024-05-09 ⋅ 阅读:(27) ⋅ 点赞:(0)

反射概述:

1.反射是指对于任何一个Class类,在"运行的时候"都可以直接得到这个类全部成分。
2.在运行时,可以直接得到这个类的构造器对象:Constructor
3.在运行时,可以直接得到这个类的成员变量对象:Field
4.在运行时,可以直接得到这个类的成员方法对象:Method
5.这种运行时动态获取类信息以及动态调用类中成分的能力称为Java语言的反射机制。

反射的第一步:获取Class类对象,如此才可以解析类的全部成分:

Class c1 = Class.forName(“全类名”);//方式一(常用)
 Class<类名> c2= 类名.class;//方式二
Class c3 = 对象.getClass();//方式三(对象传过来的)

/*拓展*/
/*读取配置文件*/
 Properties properties = new Properties();
properties.load(this.getClass().getClassLoader().getResourceAsStream("配置文件路径"));
String vualue = properties.getProperty("要读取配置文件的key");

通过Class获取构造器创建对象:

/*获取到Class对象*/
Class<类名> 对象x= 类名.class; 

/*基于Class对象,获取到构造器(Constructor)*/
 Constructor<类名> constructor = 对象x.getConstructor();//方法中没有指定参数类型,故获取到的是无参构造方法

/*利用构造器,创建对象*/
类名 对象= constructor.newInstance();//无参构造方法中不需要传递具体的数据
Constructor<类名> constructor = 对象x.getConstructor(参数类型.class ,参数类型.class);//基于Class对象,获取public修饰的全参构造方法 
类型 对象= constructor.newInstance(实参1, 实参二);//使用构造器,创建对象


 /*基于Class对象,“获取私有的构造方法”*/
Constructor<类名> 对象y= 对象x.getDeclaredConstructor(参数类型.class);
cons.setAccessible(true);//取消权限检查。原因:idea有权限检查限制
类 对象= 对象y.newInstance(实参);

 /*基于Class对象,获取所有的构造方法(包含:私有)*/
 Constructor<?>[] constructors = userClass.getDeclaredConstructors();
for (Constructor<?> cons : constructors) {
            ······
        }

通过Class调用类方法

  /*获取Class对象*/
Class<类名> 对象x = Student.class;
类名 对象y= 对象x.newInstance();//可以使用Class类中的newInstance()方法直接调用Student类中的无参构造创建对象

/*基于Class对象,获取到Method对象(成员方法对象)*/
Method method=  对象x.getMethod("类的方法名");//获取public修饰的无参study方法

/利用Method对象,运行方法*/
method.invoke(对象y);

 /*基于Class对象,获取到所有的public修饰的Method对象(成员方法对象)*/
Method[] methods = 对象x.getMethods();//获取本类中的public修饰的方法,以及父类中的方法

  /*基于Class对象,获取到本类所有的方法(包含:私有)*/
Method[] methods = 对象x.getDeclaredMethods();


  //基于Class对象,获取带参数方法
Method method = 对象x.getMethod("方法名", 类型.class);
/*利用Method对象,运行方法*/
 method.invoke( 对象y, "张三");


 //基于Class对象,获取私有的方法
Method method = 对象x.getDeclaredMethod("私有方法名", 参数类型.class, ····);
method.setAccessible(true);//取消权限检查。原因:idea有权限检查限制
 Object result = method.invoke(对象y,实参,····); //3、利用Method对象,运行方法 (如果知道返回值类型,Object 可以换成具体类型)


/*基于Class对象,获取静态方法*/
Method method = 对象x.getDeclaredMethod("静态方法", 参数类型.class);
 /*利用Method对象,运行方法*/
method.invoke(null,  实参);//静态方法的调用是通过 : 类名.静态方法,所以用null填空

通过Class获取类的属性:

 /*获取Class对象*/
Class<类名> 对象x= 类名.class;
类名 对象y= 对象x.newInstance();

 /*基于Class对象,获取public修饰的Field对象(成员变量)*/
Field[] fields = 对象x.getFields();

for (Field field : fields) { ·····}

/*基于Class对象,获取所有的Field对象(包含:私有成员变量)*/
 Field[] fields =对象x.getDeclaredFields();
for (Field field : fields) { ·····}

 /*基于Class对象,获取public修饰的Field对象,给成员(属性赋值)*/
Field field = 对象x.getField("属性名1");
/*利用Field对象,赋值、取值  (成员变量,也称为:实例变量,是通过对象名来访问)*/
field.set( 对象y,实参);//赋值
Object result = field.get(对象y);//获取属性名1的值


 /基于Class对象,获取私有成员变量*/
Field field = 对象x.getDeclaredField("私有成员(属性)");
field.setAccessible(true);//取消本次权限检查。原因:idea有权限检查限制
/*利用Field对象,赋值、取值  (成员变量,也称为:实例变量,是通过对象名来访问)*/
field.set( 对象y,实参);//赋值
Object result = field.get(对象y);//获取私有成员(属性)的值