Java杂谈来一发(三)反射和Class类

Java反射是Java被视为动态语言的一个关键性质,这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。

反射找到类信息的过程:

1)通过类的全限定名可以找到该类的Class类的对象:Class<?> refClass = Class.forName("somepackage.ReflectionTest);

2)通过Class类的对象可以查到该类的方法、成员变量等信息,最底层调用的是native方法查询class文件中的内容;

3)如果Class类的对象的ReflectionData数据体为空,则从JVM中获取;

这里介绍一下Class类,我们知道所有Java类都继承自java.lang.Object类,Object类中引用了Class对象,调用Object的getClass()方法,可以取得该类被实例化的对象的类的引用,这个引用指向的是Class类的对象。该对象在该类被调用时,由JVM自动创建,Class对象无法人为主动创建。该对象有个字段记录了类加载器,如果该字段为null,则该类的类加载器为Bootstrap classloader。

通过Class对象的getClassLoader(),可以查到类加载器,通过类加载器就可以得到ReflectionData中类信息,ReflectionData具体内容如下:

// Class对象中的ReflectionData
static class ReflectionData<T> {
   volatile Field[] declaredFields;
   volatile Field[] publicFields;
   volatile Method[] declaredMethods;
   volatile Method[] publicMethods;
   volatile Constructor<T>[] declaredConstructors;
   volatile Constructor<T>[] publicConstructors;
   volatile Field[] declaredPublicFields;
   volatile Method[] declaredPublicMethods;
   final int redefinedCount;

   ReflectionData(int redefinedCount) {
      this.redefinedCount = redefinedCount;
   }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值