反射

101 阅读2分钟

获取class类

  1. Class.class
  2. obj.getClass() //某个模块的src目录下
  3. Class.forName("com.bwj.com.xxxx")
  4. ClassLoader classLoader = ReflectionTest.class.getClassLoader(); Class clazz4 = classLoader.loadClass("com.atguigu.java.Person");

类加载过程

  • 加载

将class文件加载到方法区的运行时结构,生成一个java.lang.Class对象 该过程需要类加载器

  • 链接

验证:

准备:将属性初始化

解析:将常量池中的引入链接至属性

  • 初始化

执行类构造器给属性赋值,如果当前类的父类尚未初始化。则先初始化父类。

类构造器:是编译期 收集类变量的赋值动作和静态代码块中的语句生成的

  • 作用

加载一个类 并将类信息缓存信息 gc会回收

类加载器

  • 分类:

引导类加载器,扩展类加载器,系统类加载器

  • 获取:

系统类加载器 class.·getClassLoader();

扩展类加载器 classLoader.getParent()

  • 类加载器加载文件:
classLoader.getResourceAsStream("jdbc1.properties");
  • 创建类对象: clazz.newInstance();

获取类内部结构

  • 获取属性及相关 getFields():获取当前运行时类及其父类中声明为public访问权限的属性

getDeclaredFields():获取当前运行时类中声明的所有属性。(不包含父类中声明的属性)

Field.getModifiers();权限修饰符 Modifier.toString(modifier) 转义

f.getType()数据类型

f.getName() 变量名

  • 获取方法及相关

getMethods():获取当前运行时类及其所有父类中声明为public权限的方法

getDeclaredMethods():获取当前运行时类中声明的所有方法。

m.getAnnotations()获取方法声明的注解

m.getModifiers()权限修饰符 Modifier.toString()转义

m.getReturnType().getName()返回值类型

m.getName()方法名

m.getParameterTypes()形参列表

m.getExceptionTypes()抛出的异常

  • 获取其它的一些玩意 getConstructors():获取当前运行时类中声明为public的构造器

getDeclaredConstructors():获取当前运行时类中声明的所有的构造器

clazz.getSuperclass()获取运行时类的父类

clazz.getGenericSuperclass()获取运行时类的带泛型的父类

paramType.getActualTypeArguments() 获取泛型类型

clazz.getInterfaces() 获取运行时类实现的接口

clazz.getPackage()获取运行时类所在的包

clazz.getAnnotations()获取运行时类声明的注解

  • 调用运行时类中的属性方法等

clazz.getField("id") 获取指定的类属性:要求运行时类中属性声明为public

field.set(obj,value) 参数1:指明设置哪个对象的属性 参数2:将此属性值设置为多少

field.get(obj) 获取对象的属性值

clazz.getDeclaredField("name") 获取指定的类属性

field.setAccessible(true);

clazz.getDeclaredMethod():参数1 :指明获取的方法的名称 参数2:指明获取的方法的形参列表

method.setAccessible(true)保证当前方法是可访问的

调用方法的invoke():参数1:方法的调用者 参数2:给方法形参赋值的实参。返回值即为对应类中调用的方法的返回值。

clazz.getDeclaredConstructor():参数:指明构造器的参数列表

constructor.newInstance("Tom");调用此构造器创建运行时类的对象

作者:刘涛