反射

本文详细介绍了Java中的类加载过程,包括加载、验证、准备、解析和初始化阶段。接着讨论了类加载器的分类和作用,如引导类加载器、扩展类加载器和系统类加载器。此外,还讲解了如何通过反射创建类对象、获取类内部结构(属性、方法、构造器)以及如何访问和修改这些元素。最后,提到了注解在类和方法中的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

获取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”);调用此构造器创建运行时类的对象

作者:刘涛

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

中亿丰数字科技集团有限公司

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值