一文看懂 反射

本文仅用于自我总结,无任何高深技术,大佬绕行,如有不足,见谅!

1. 概念

什么是反射:在运行时 通过字节码文件 动态的获取类的成员和创建对象的技术

例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类                        进行解剖,把个个组成部分映射成一个个对象。

学习的重点:

  1. Class :类的字节码文件对象
  2. Method: 方法
  3. Constructor:构造方法
  4. Field:属性

2. 如何获取一个类的class(字节码文件对象) 

  1.  通过Object的getClass方法
    Class cla1=new Demo().getClass();
  2.  通过静态属性class
    Class cla2=Demo.class;
  3.  通过Class类的静态方法forName
    Class cla3=Class.forName("test05_reflect.Demo");

注意:在运行期间,一个类,只有一个Class对象产生。

三种方式常用第三种,第一种对象都有了还要反射干什么。第二种需要导入类的包,依赖太强,不导包就抛编译错误。一般都第三种,一个字符串可以传入也可写在配置文件中等多种方法。

 

3.Class类:对类的字节码文件的封装

 类中的方法

  1. static Class forName(String className) :通过类名获取类的字节码文件对象
      
  2. ClassLoader getClassLoader() 
     
  3. Constructor[] getConstructors()  :获取所有的public构造方法
    Constructor[] getDeclaredConstructors() :获取所有的构造方法
    Constructor<T> getDeclaredConstructor(Class... parameterTypes) :获取指定的构造方法 
    Constructor<T> getConstructor(Class... parameterTypes)  :获取指定的public构造方法
        
  4. Method[] getMethods() :获取所有的public方法
    Method getMethod(String name, Class... parameterTypes) :获取指定的public方法 
    Method[] getDeclaredMethods() :获取所有的方法
    Method getDeclaredMethod(String name, Class... parameterTypes)  :获取指定的方法 
     
  5.  Field[] getFields()  :获取所有的public属性
     Field[] getDeclaredFields() :获取所有的属性
     Field getField(String name):获取指定的public属性
     Field getDeclaredField(String name):获取指定的属性    
  6. String getName() :获取包名.类名
    String getSimpleName() :获取类名
  7. T newInstance() :创建对象 ::通过无参数的构造方法创建对象

重点方法:

  1.  static Class forName(String className) :通过类名获取类的字节码文件对象

  2.  xxx  getXxx()+xxx getDeclaredXxx():::获取构造方法+方法+字段

  3.   String getxxxName() :获取包名.类名

  4.   T newInstance() :创建对象 ::通过无参数的构造方法创建对象

4. Constructor类:对构造方法的封装

类中的方法

  1. T newInstance(Object... initargs) :创建对象 
  2. Class[ ] getParameterTypes()  :获取参数列表
  3. int getModifiers()  :获取修饰符
  4. String getName() :获取构造方法名
  5. Class[ ] getExceptionTypes() :获取抛出的异常
  6. void setAccessible(boolean flag):暴力访问 取消范围修饰符检查

重点方法

  1. T newInstance(Object... initargs) :创建对象  
  2. void setAccessible(boolean flag):暴力访问 取消范围修饰符检查

5. Method类 :对方法的封装

  1. Class[] getExceptionTypes()  :获取方法抛出的所有异常类型
  2. int getModifiers() 获取方法的修饰符
  3. String getName() :获取方法的名字
  4. Class[] getParameterTypes() :获取方法的参数列表
  5. Class getReturnType() :获取方法的返回值类型
  6. void setAccessible(boolean flag):设置暴力访问
  7. Object invoke(Object obj, Object... args) :执行方法

 6. Field类:对类的属性的封装

  1. String getName() :获取属性名
  2. Class getType()  :获取属性类型
  3. int getModifiers():获取修饰符
  4.  void setAccessible(boolean flag) :暴力访问
  5. Object get(Object obj) :获取参数对象obj的当前属性的值
  6.  void set(Object obj, Object value)  :设置参数对象obj的当前属性值为value  

总结来说就是

        1个概念
        4个类
        8个方法

 7.  面试题

哪里用到反射机制?

  1. JDBC中,利用反射动态加载了数据库驱动程序。
  2. Web服务器中利用反射调用了Sevlet的服务方法。
  3. Eclispe等开发工具利用反射动态刨析对象的类型与结构,动态提示对象的属性和方法。
  4. 很多框架都用到反射机制,注入属性,调用方法,如Spring。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值