Java反射

  • class(包括interface)的本质是数据类型
  • 无继承关系的数据类型无法赋值
  • class/interface的数据类型是Class
  • 每加载一个class,JVM就为其创建一个Class类型的实例,并关联起来
  • JVM持有的每个Class实例都指向一个数据类型(class或interface)
  • 一个Class实例包含了该class的完整信息  
  • Class
    • JVM为每个加载的class创建对应的Class实例,并在实例中保存该class的所有信息
    • 如果获取了某个Class实例,则可以获取到该实例对应的class的所有信息
    • 通过Class实例获取class信息的方法称为反射(Reflection)
  • 如何获取一个class的Class实例?
    • Type.class              Class cls = String.class;
    • getClass()               String s = "Hello";  Class cls = s.getClass();
    • Class.forName()     Class cls = Class.forName("java.lang.String");   
  • Class实例在JVM中是唯一的,因此可以使用==比较两个Class实例
  • 。。。一般使用instanceof判断数据类型
  • 反射的目的:当获得某个Object实例是,我们可以获取该Object的class信息
  • 从Class实例获取class信息
    • getName() 
    • getSingleName()
    • getPackage()
  • 从Class实例判断class类型
    • isInterface()
    • isEnum()
    • isArray()
    • isPrimitive() 判断基本类型
  • 创建class实例
    • newInstance() 
  • 利用JVM动态加载Class的特性:
    • 可以在运行期根据条件加载不同的实现类



通过反射访问字段:
  • Field对象封装了字段的所有信息
  • 通过Class实例的方法可以获取Field实例:
    • getField/getFields/getDeclaredField/getDeclaredFields
  • 通过Field实例可以获取字段信息
    • getName/getType/getModifiers
  • 通过Field实例可以读取或设置某个对象的字段:
    • get(Object instance) / set(Object instance,Object fieldValue)
  • 通过设置setAccessible(true)来访问非public字段


通过反射调用方法:
  • Method对象包含一个method的所有信息
    • getName()
    • getReturnType()
    • getParameterTypes()
    • getModifiers()      返回方法的修饰符
  • 调用无参数的Method
    • Object invoke(Object obj)
  • 调用带参数的Method
  • Object invoke (Object obj,Object... args)
  •   通过设置setAccessible(true)来访问非public方法


 通过反射调用构造方法:
  • Class.newInstance()只能调用public无参数构造方法
    • String s = (String) String.class.newInstance()
  • Constructor对象
    • 包含一个构造方法的所有对象,可以创建一个实例
    • Constructor对象封装了构造方法的所有信息
  • 通过Class实例的方法可以获取Constructor实例:
    • getConstructor / getConstructors / getDeclaredConstructor / getDeclaredConstructors
  • 通过Constructor实例可以创建一个实例对象:
    • newInstance(Object... parameters)
  • 通过设置setAccessible(true)来访问非public构造方法



通过反射获取继承关系:
  • 获取父类的Class:
    • Class getSuperclass()    Class sup = Integer.class.getSuperclass();  //Number.class
    • Object的父类是null
    • interface的父类是null
  • 获取当前类直接实现的interface:
    • Class[] getInterfaces()
    • 不包括间接实现的interface
    • 没有interface的class返回空数组
    • interface返回继承的interface
  • 通过Class对象可以获取继承关系:
    • getSuperclass()
    • getInterfaces()
  • 通过Class对象的isAssignableFrom()方法可以判断一个向上转型是否正确
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值