• Java-反射


    越王勾践、卧薪尝胆
    文章持续更新,可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】获取福利,回复【项目】获取项目源码,回复【简历模板】获取简历模板,回复【学习路线图】获取学习路线图。

    在这里插入图片描述


    前言

    通过Java的反射机制,程序员可以更深入地控制程序的运行过程,如在程序运行时对用户输入的信息进行验证,还可以逆向控制程序的执行过程。
    另外,Java还提供了Annotation功能,该功能建立在反射机制的基础上,本章对此也作了讲解,包括定义Annotation类型的方法和在程序运行时访问Annotation信息的方法。

    一、Class类与Java反射

    通过Java反射机制,可以在程序中访问已经装载到JVM中的Java对象的描述,实现访问、检测和修改描述Java对象本身信息的功能。Java反射机制的功能十分强大,在java.lang.reflect包中提供了对该功能的支持。
    众所周知,所有Java类均继承了Object类,在Object类中定义了一个getClass()方法,该方法返回一个类型为Class的对象。例如

    Class textFieldC = textField.getClass();
    
    • 1

    利用Class类的对象textFieldC,可以访问用来返回该对象的textField对象的描述信息。可以访问的主要描述信息如下表。

    组成部分访问方法返回值类型说明
    包路径getPackage()Package对象获得该类的存放路径
    类名称getName()String对象获得该类的名称
    继承类getSuperclass()Class对象获得该类继承的类
    实现接口getInterfaces()Class型数组获得该类实现的所有接口

    1、访问构造方法

    在通过下列一组方法访问构造方法时,将返回Constructor类型的对象或数组。每个Constructor对象代表一个构造方法,利用COnstructor对象可以操纵相应的构造方法。

    getConstructors()
    getConstructor(Class...parameterTypes) getDeclaredConstructors() getDeclaredConstructor(Class …parameterTypes)

    2、访问成员变量

    在通过下列一组方法访问成员变量时,将返回Field类型的对象或数组。每个Field对象代表一个成员变量,利用Field对象可以操纵相应的成员变量。

    getFields()
    getField(String name)
    getDeclaredFields()
    getDeclaredField(String name)

    3、访问方法

    在通过下列一组方法访问方法时,将返回Method类型的对象或数组。每个Method对象代表一个方法,利用Method对象可以操纵相应的方法。

    getMethods()
    getMethod(String name,Class...parameterTypes) getDeclaredMethods() getDeclaredMethod(Sting name,Class…parameterTypes)

    二、使用Annotation功能

    Java中提供了Annotation功能,该功能可用于类、构造方法、成员变量、方法、参数等的声明中。该功能并不影响程序的运行,但是会对编译器警告等辅助工具产生影响。

    1、定义Annotation类型

    在定义Annotation类型时,也需要用到用来定义接口的interface关键字,但需要在interface关键字前加一个“@”符号,即定义Annotation类型的关键字为@interface,这个关键字的隐含意思是继承了java.lang.annotation.Annotation接口。例如,下面的代码就定义了一个Annotation类型

    public @interface NoMemberAnnotation{
    }
    
    • 1
    • 2

    上面定义的Annotation类型@NoMemberAnnotation未包含任何成员,这样的Annotation类型被称为marker annotation。下面的代码定义了一个只包含一个成员的Annotation类型。

    public @interface OneMemberAnnotation{
    	String value();
    }
    
    • 1
    • 2
    • 3

    2、访问Annotation信息

    如果在定义Annotation类型时将@Retention设置为RetentionPolicy.RUNTIME,那么在运行程序时通过反射就可以获取到相关的Annotation信息,如获取构造方法、字段和方法的Annotation信息。
    类Constructor、Field和Method均继承了AccessibleObject类,在AccessibleObject中定义了3个关于Annotation的方法,其中方法isAnnotationPresent(Class annotationClass)用来查看是否添加了指定类型的Annotation,如果是则返回true,否则返回false;方法getAnnotation(Class annotationClass)用来获得指定类型的Annotation,如果存在则返回相应的对象,否则返回null;方法getAnnotations()用来获得所有的Annotation,该方法将返回一个Annotation数组。
    在类Constructor和Method中还定义了方法getParameterAnnotations(),用来获得为所有参数添加的Annotation,将以Annotation类型的二维数组返回,在数组中的顺序与声明的顺序相同,如果没有参数则返回一个长度为0的数组;如果存在未添加Annotation的参数,将用一个长度为0的嵌套数组占位。

    三、总结

    这里的相关内容还没有整理完毕,文章后面持续更新,建议收藏。

    文章中涉及到的命令大家一定要像我一样每个都敲几遍,只有在敲的过程中才能发现自己对命令是否真正的掌握了。

    可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】获取福利,回复【项目】获取项目源码,回复【简历模板】获取简历模板,回复【学习路线图】获取学习路线图。

  • 相关阅读:
    大语言模型基础-Transformer模型详解和训练
    c++ 单源最短路径-狄杰斯特拉算法
    【研发工具】Centos下搭建轻量级内网FTP服务器
    利用bat脚本 一键将文件中的png图片转为 jpg图片
    ORACLE 在内存管理机制上的演变和进化
    进程概念[上]
    nodejs中使用ffmpeg零基础教程(electron+vue3)
    RenduCore笔记-c++实用库
    Redis命令集合
    软件测试/测试开发丨基于人工智能的代码分析与 Bug 检测实战
  • 原文地址:https://blog.csdn.net/weixin_44096133/article/details/126088479