[精华!]最新Java反射机制 底层架构源码!

一,初识反射

1.1概念:
        在程序运行中,我们的每一个java文件都会被编译成class文件,class文件会被jvm加载进内存,jvm会解析class文件中的内容封装成一个class对象,将java类中的成员变量,成员方法,构造方法都封装成一个个对象,这些对象都保存在class对象的身上.我们反射要做的事情就是操作class对象身上的成员变量对象,成员方法对象,构造方法对象.

1.2 获取class对象的三种方式

 

1 @Test 
2 public void testGetClass() throws ClassNotFoundException {   
3  //1.通过Class对象的forName(全类名)静态方法获取;全类名=包名.类名    Class<Person> clazz1 = (Class<Person>) Class.forName("cn.itcast.domain.Person");   
4  //2.通过类名.class获取    Class<Person> clazz2 = Person.class;  
5 //3.通过对象的getClass()方法获取    Person person = new Person();    Class<Person> clazz3 = (Class<Person>) person.getClass(); }

 

 

1.3 通过class对象获取成员变量,构造方法,成员方法

     1.在以下列数的get方法中:尾部带 s的方法表示可以获取多个数据,不带 s的方法表示获取指定的数据,带Declared的方法表示获取任意类型数据,

不带Declared的方法则表示获取public修饰的成员/构造的方法.

 1 * 获取功能:   
 2 1. 获取成员变量们        
 3 Field[] getFields() :获取所有public修饰的成员变量      
 4 Field getField(String name)   获取一个指定名称的public修饰的成员变量
 5  
 6 Field[] getDeclaredFields()  获取所有的任意修饰符类型成员变量       
 7 Field getDeclaredField(String name)  获取任意修饰符类型指定名称的成员变量   
 8 
 9 2. 获取构造方法们     
10 Constructor<?>[] getConstructors()  获取所有public修饰的构造方法         Constructor<T> getConstructor(Class<?>... parameterTypes)  获取指定参数类型的public类 型的构造
11  
12 Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)  获取指定参数类型的 任意类型的构造       
13 Constructor<?>[] getDeclaredConstructors()  获取任意类型所有的构造方法
14  3. 获取成员方法们:
15 Method[] getMethods()  获取所有public修饰的方法(可以获取父类的public修饰的方法)        
16 Method getMethod(String name, Class<?>... parameterTypes)  获取一个指定名称指定参数类型 的public类型成员方法
17  
18 Method[] getDeclaredMethods()   获取任意类型所有的成员方法        Method getDeclaredMethod(String Class, 类<?>... parameterTypes)  获取一个指定名称指定 参数类型的任意类型成员方法
19  
20 4. 获取全类名/成员变量名称/成员方法名称/构造方法名称  
21 String getName()

 

1.4 操作成员变量,构造方法,成员方法

0.暴力开启反射开关 (针对成员变量是非public修饰的  要在set/get之前设置)

field.setAccessible(true)

1.操作成员变量

field.get(Object obj) 表示获取哪个对象的field成员变量值 ;

field.set(Object obj,Object value) 表示设置obj对象的field成员变量的值为value;

 

2.操作构造方法 :创建对象

1 Object obj=constructor.newInstance(Object...param);创建对象,并且传递构造需要的参数
2  Object obj=Class对象.newInstance(); 执行的是空参构造

 

3.操作成员方法:调用方法

1 method.invoke(Object obj, Object... args);执行obj对象身上的method方法并给方法传递的参数值为args

 

二 .一张图带你了解反射原理

 

 

...

 

 

转载于:https://www.cnblogs.com/wsfighting1218/p/10455002.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值