获取class类
-
Class.class
-
obj.getClass()
//某个模块的src目录下 -
Class.forName(“com.bwj.com.xxxx”)
-
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”);调用此构造器创建运行时类的对象
作者:刘涛