java反射和java注解
反射框架设计的灵魂框架半成品软件。可以在框架的基础上进行软件开发简化编码反射通过Class类型的对象字节码文件对象来操作对应的.class文件。可以在程序运行过程中操作这些对象这就是java的反射机制如下图。java反射的好处和作用只说明一个问题就是可以在程序运行中操作对象反射的好处1. 可以在程序运行过程中操作这些对象。2. 可以解耦提高程序的可扩展性。反射的作用在运行时判断任意一个对象所属的类在运行时构造任意一个类的对象在运行时判断任意一个类所具有的成员变量和方法通过反射设置可以调用 private在运行时调用任意一个对象的方法获取class对象的方式同一个字节码文件(*.class)在一次程序运行过程中只会被加载一次不论通过哪一种方式获取的Class对象都是同一个。packagecom.demo.reflectDemo;importlombok.AllArgsConstructor;importlombok.Getter;importlombok.NoArgsConstructor;GetterNoArgsConstructorAllArgsConstructorpublicclassStudent{privateStringname;publicvoidstudy(){System.out.println(好好学习);}}packagecom.demo.reflectDemo;publicclassReflectDemo{publicstaticvoidmain(String[]args)throwsClassNotFoundException,IllegalAccessException,InstantiationException{/** * 获取Class对象 */// 通过指定的字符串路径获取// 多用于配置文件将类名定义在配置文件中。读取文件加载类Class?aClassClass.forName(com.demo.reflectDemo.Student);// com.demo.reflectDemo.StudentSystem.out.println(aClass.getName());// 通过类名的属性class获取多用于参数的传递ClassStudentstudentClassStudent.class;// com.demo.reflectDemo.StudentSystem.out.println(studentClass.getName());// 通过对象的getClass()方法获取多用于对象的获取字节码的方式StudentlxnewStudent(lx);Class?extendsStudentaClass2lx.getClass();// com.demo.reflectDemo.StudentSystem.out.println(aClass2.getName());System.out.println();/** * * Class对象相关方法 */// 获得简单类名只是类名没有包StringsimpleNameaClass2.getSimpleName();// StudentSystem.out.println(simpleName);// 获取完整类名包含包名类名// com.demo.reflectDemo.StudentSystem.out.println(aClass2.getName());// 创建此 Class 对象所表示的类的一个新实例。// 要求类必须有public的无参数构造方法StudentstudentaClass2.newInstance();//com.demo.reflectDemo.Student1540e19dSystem.out.println(student);}}Constructor类Constructor是构造方法类类中的每一个构造方法都是Constructor的对象通过Constructor对象可以实例化对象。packagecom.demo.reflectDemo;importjava.lang.reflect.Constructor;importjava.lang.reflect.InvocationTargetException;publicclassReflectDemo{publicstaticvoidmain(String[]args)throwsClassNotFoundException,IllegalAccessException,InstantiationException,NoSuchMethodException,InvocationTargetException{System.out.println(Constructor类);// 根据参数类型获取构造方法对象只能获得public修饰的构造方法。// 如果不存在对应的构造方法则会抛出 java.lang.NoSuchMethodException 异常。Constructor?extendsStudentconstructoraClass2.getConstructor(String.class);// public com.demo.reflectDemo.Student(java.lang.String)System.out.println(constructor);// 根据参数类型获取构造方法对象包括private修饰的构造方法。// 如果不存在对应的构造方法则会抛出 java.lang.NoSuchMethodException 异常。Constructor?extendsStudentdeclaredConstructoraClass2.getDeclaredConstructor(String.class);// public com.demo.reflectDemo.Student(java.lang.String)System.out.println(declaredConstructor);// 获取所有的public修饰的构造方法Constructor?[]constructorsaClass2.getConstructors();for(Constructor?constructor1:constructors){// public com.demo.reflectDemo.Student()// public com.demo.reflectDemo.Student(java.lang.String)System.out.println(constructor1);}// 获取所有构造方法包括privat修饰的// Constructor[] getDeclaredConstructors()System.out.println(Constructor类中常用方法);Studentstudent1declaredConstructor.newInstance(zs);// zsSystem.out.println(student1.getName());// 在获取private构造方法时java会检查权限就获取不到private// 所以执行构造方法之前我们需要取消java语言的访问检查// void setAccessible(true)}}Method类Method是方法类类中的每一个方法都是Method的对象通过Method对象可以调用方法。// 根据方法名和参数类型获得一个方法对象只能是获取public修饰的MethodgetMethod(方法名,方法的参数类型...类型)// 根据方法名和参数类型获得一个方法对象包括private修饰的MethodgetDeclaredMethod(方法名,方法的参数类型...类型)// 获取所有的public修饰的成员方法包括父类中Method[]getMethods()// 获取当前类中所有的方法包含私有的不包括父类中Method[]getDeclaredMethods()// Method类中常用方法// 据参数args调用对象obj的该成员方法 如果objnull则表示该方法是静态方法Objectinvoke(Objectobj,Object...args)// 暴力反射设置为可以直接调用私有修饰的成员方法voidsetAccessible(booleanflag)案例packagecom.demo.reflectDemo;importjava.io.IOException;importjava.io.InputStream;importjava.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;importjava.util.Properties;publicclassReflectDemo2{publicstaticvoidmain(String[]args)throwsIOException,ClassNotFoundException,IllegalAccessException,InstantiationException,NoSuchMethodException,InvocationTargetException{// 可以创建任意类的对象可以执行任意方法// 前提不能改变该类的任何代码。// 1. 加载配置文件// 1.1 创建Properties对象PropertiespropertiesnewProperties();// 1.2 获取class目录下的配置文件ClassLoaderclassLoaderReflectDemo2.class.getClassLoader();InputStreaminputStreamclassLoader.getResourceAsStream(application.properties);properties.load(inputStream);// 2. 获取配置文件中定义的数据StringclassNameproperties.getProperty(class.name);StringmethodNameproperties.getProperty(class.method.name);// 3. 加载该类进内存Class?aClassClass.forName(className);// 4. 创建对象ObjectobjaClass.newInstance();// 5. 获取方法对象MethodmethodaClass.getMethod(methodName);// 6. 执行方法method.invoke(obj);// 好好学习}}注解注解概述定义注解Annotation也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性与类、 接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面用来对这些元素进行说明注释。作用分类生成文档通过代码里标识的注解生成文档【例如生成文档doc文档author用来标识作者名】代码分析跟踪代码依赖性实现替代配置文件功能。比较常见的是spring 2.5 开始的基于注解配置。作用就是减少配置。现在的框架基本都使用了这种配置来减少配置文件的数量编译检查在编译时进行格式检查。如Override放在方法前如果你这个方法并不是覆盖了超类方法则编译时就能检查出【例如Override】自定义注解packagecom.demo.annotationDemo;// 定义格式// 注解本质上就是一个接口该接口默认继承Annotation接口publicinterfaceAnnotationDemo{}注解的属性属性的作用可以让用户在使用注解时传递参数让注解的功能更加强大。属性的格式格式1数据类型 属性名();格式2数据类型 属性名() default 默认值;packagecom.demo.annotationDemo;// 定义格式// 注解本质上就是一个接口该接口默认继承Annotation接口publicinterfaceAnnotationDemo{Stringname();// 姓名intage()default18;// 年龄Stringgender()default男;// 性别// 该注解就有了三个属性nameagegender}属性适用的数据类型八种基本数据类型int,float,boolean,byte,double,char,long,short)String类型Class类型枚举类型注解类型以上所有类型的一维数组注解使用的注意事项空注解可以直接使用一个注解只能在一个位置上使用一次一个位置上可以使用多个不同的注解如果属性有默认值可以不赋值没有默认值必须赋值如果一个注解中只有一个属性value那么赋值时可以省略属性名如果属性值是数组类型多个属性值使用{}单个属性值{}可以省略使用自定义注解packagecom.demo.annotationDemo;publicinterfaceBook{Stringvalue();doubleprice()default100;String[]authors();}packagecom.demo.annotationDemo;publicclassBookShelf{Book(valuezs,price998,authors{666,777})publicvoidshowBook(){}}特殊属性 value()当注解中只有一个属性且名称是value在使用注解时给value属性赋值可以直接给属性值无论value是单值元素还是数组类型。如果注解中除了value属性还有其他属性且至少有一个属性没有默认值则在使用注解给属性赋值时value属性名不能省略。BookpublicinterfaceBook{Stringvalue();// 书名 }BookpublicclassBookShelf{Book(西游记)publicvoidshowBook(){}}注解之元注解默认情况下注解可以用在任何地方比如类成员方法构造方法成员变量等地方。如果要限制注解的使用位置怎么办那就要学习一个新的知识点元注解。元注解之Target作用指明此注解用在哪个位置如果不写默认是任何地方都可以使用。可选的参数值在枚举类ElemenetType中包括TYPE 用在类,接口上FIELD用在成员变量上METHOD 用在方法上PARAMETER用在参数上CONSTRUCTOR用在构造方法上LOCAL_VARIABLE用在局部变量上元注解之Retention作用定义该注解的生命周期(有效范围)。可选的参数值在枚举类型RetentionPolicy中包括SOURCE注解只存在于Java源代码中编译生成的字节码文件中就不存在了。CLASS注解存在于Java源代码、编译以后的字节码文件中运行的时候内存中没有默认值。RUNTIME注解存在于Java源代码中、编译以后的字节码文件中、运行时内存中程序可以通过反射获取该注解。元注解使用实例packagecom.example.demo;importjava.lang.annotation.ElementType;importjava.lang.annotation.Target;Target({ElementType.METHOD,ElementType.TYPE})interfaceStu{Stringname();}packagecom.example.demo;Stu(namejack)publicclassAnnotationDemo02{// 成员变量Stu(namelily)// 编译失败privateStringgender;// 成员方法Stu(namerose)publicvoidtest(){}// 构造方法Stu(namelucy)// 编译失败publicAnnotationDemo02(){}}注解解析通过Java技术获取注解数据的过程则称为注解解析与注解解析相关的接口Anontation所有注解类型的公共接口类似所有类的父类是ObjectAnnotatedElement定义了与注解解析相关的方法常用方法以下四个// 判断当前对象是否有指定的注解有则返回 true否则返回falsebooleanisAnnotationPresent(ClassannotationClass)// 获得当前对象上指定的注解对象TgetAnnotation(ClassTannotationClass)// 获得当前对象及其从父类上继承的所有的注解对象Annotation[]getAnnotations()// 获得当前对象上所有的注解对象不包括父类的Annotation[]getDeclaredAnnotations()获取注解数据的原理注解作用在那个成员上就通过反射获得该成员的对象来得到它的注解。如注解作用在方法上就通过方法(Method)对象得到它的注解// 得到方法对象Methodmethodclazz.getDeclaredMethod(方法名);// 根据注解名得到方法上的注解对象Bookbookmethod.getAnnotation(Book.class);如注解作用在类上就通过Class对象得到它的注解// 获得Class对象Classc类名.class;// 根据注解的Class获得使用在类上的注解对象Bookbookc.getAnnotation(Book.class);java常见注解SuppressWarnings作用SuppressWarnings注解用于告诉编译器在编译过程中忽略特定类型的警告信息。通过使用这个注解你可以指示编译器不要发出某些警告从而减少在编译时看到不相关的警告。这个注解的使用方式如下SuppressWarnings(value{警告类型1,警告类型2,...})或者更简洁地SuppressWarnings(警告类型)其中value参数是一个字符串数组用于指定要忽略的警告类型。这些警告类型可以是编译器定义的警告类型也可以是一些自定义的字符串value取值常见的警告类型包括all忽略所有类型的警告。unchecked忽略未经检查的警告通常在使用泛型时出现。deprecation忽略使用已过时的 API 的警告。rawtypes忽略使用不带泛型类型的原始类型的警告。unused忽略未使用的代码或变量的警告。restriction忽略使用了受限制的 API 的警告通常用于访问非公开或不稳定的 API。示例使用SuppressWarnings(unchecked)publicvoidmyMethod(){ListmyListnewArrayList();// 忽略未经检查的警告myList.add(Hello);}SuppressWarnings({rawtypes,deprecation})publicvoidmyOtherMethod(){DatedatenewDate();// 忽略使用了已过时和原始类型的警告}需要注意的是尽管可以使用 SuppressWarnings 来忽略警告但这并不是解决问题的最佳方法。更好的方式是通过代码的重构或调整来消除警告以确保代码的质量和可维护性。在使用 SuppressWarnings 时应当慎重考虑确保了解可能的风险和影响。PostConstructPostConstruct注解的方法在项目启动的时候执行这个方法也可以理解为在spring容器启动的时候执行可作为一些数据的常规化加载比如数据字典之类的。执行顺序Constructor Autowired PostConstruct正确的做法是我们多辛苦一些让客户满意有了以后的合同就有了钱我们就能活下去。员工应多贡献以提高收入改善生活。我们的一些干部处于幼稚状态没有工作能力习惯将矛盾转给公司这些干部不成熟应调整他们的岗位。任正非部分内容转载自https://blog.csdn.net/CNDN_Web/article/details/132454387https://blog.csdn.net/a1k2l45k/article/details/135476656https://new.qq.com/omn/20220321/20220321A00XM100.html?pgv_refaio2015ptlang2052

相关新闻

MySQL的共享锁、排他锁、意向锁

MySQL的共享锁、排他锁、意向锁

目录一、共享锁(Shared Lock)二、排他锁(EXclusive Lock)三、意向锁(Intention Lock)MySQL锁的模式有三种:共享锁、排他锁、意向锁(意向共享锁、意向排他锁)。 一、共享锁…

2026/8/4 19:57:57 阅读更多 →
如何将MySQL卸载干净?

如何将MySQL卸载干净?

前言 前几天不知道什么情况电脑被莫名下载了MySQL8.0版本导致与本机的MySQL5.0版本冲突,导致MySQL无法正常运行,后来因为没有卸载干净MySQL导致一直下载不成功,导致我晚上失眠,现在让我们进入正题,看看如何将他卸载干…

2026/8/4 19:57:57 阅读更多 →
5分钟免费搭建原神私服:KCN-GenshinServer终极简单指南

5分钟免费搭建原神私服:KCN-GenshinServer终极简单指南

5分钟免费搭建原神私服:KCN-GenshinServer终极简单指南 【免费下载链接】KCN-GenshinServer 基于GC制作的原神一键GUI多功能服务端。 项目地址: https://gitcode.com/gh_mirrors/kc/KCN-GenshinServer 你是否曾经梦想过拥有一个完全由自己掌控的提瓦特大陆&a…

2026/8/6 0:19:15 阅读更多 →

最新新闻

紧急预警:SD WebUI 1.9.4+更新后服装语义连贯性下降41.6%!3小时内生效的兼容性热修复方案(含patch下载链接)

紧急预警:SD WebUI 1.9.4+更新后服装语义连贯性下降41.6%!3小时内生效的兼容性热修复方案(含patch下载链接)

更多请点击: https://intelliparadigm.com 第一章:SD WebUI 1.9.4服装语义连贯性骤降事件全景速览 近期,大量 Stable Diffusion WebUI 用户反馈在升级至 1.9.4 及后续版本后,生成图像中人物服装结构出现显著语义断裂现象&#xf…

2026/8/6 1:10:30 阅读更多 →
白酒行业智能推荐系统:Python+AI+可视化实战

白酒行业智能推荐系统:Python+AI+可视化实战

1. 项目概述:白酒数据智能推荐系统的核心价值这个毕业设计项目完美融合了当下最热门的三项技术——数据可视化、AI问答和Python开发,构建了一个针对白酒行业的智能数据分析与推荐平台。作为一名长期关注数据智能应用的开发者,我认为这种结合行…

2026/8/6 1:10:30 阅读更多 →
AI变现不是选赛道,而是建漏斗:头部AI公司不愿公开的3层变现结构图(含ROI测算模板)

AI变现不是选赛道,而是建漏斗:头部AI公司不愿公开的3层变现结构图(含ROI测算模板)

更多请点击: https://kaifayun.com 第一章:AI变现不是选赛道,而是建漏斗:头部AI公司不愿公开的3层变现结构图(含ROI测算模板) AI产品的商业价值从不取决于模型参数量或技术新颖性,而在于能否在…

2026/8/6 1:10:30 阅读更多 →
Loop窗口管理:基于SwiftUI的优雅macOS生产力革命

Loop窗口管理:基于SwiftUI的优雅macOS生产力革命

Loop窗口管理:基于SwiftUI的优雅macOS生产力革命 【免费下载链接】Loop Window management made elegant. 项目地址: https://gitcode.com/GitHub_Trending/lo/Loop 在macOS生态系统中,窗口管理一直是提升工作效率的关键环节。传统的窗口管理工具…

2026/8/6 1:10:30 阅读更多 →
终极ThinkPad风扇控制指南:TPFanCtrl2让散热管理变得简单

终极ThinkPad风扇控制指南:TPFanCtrl2让散热管理变得简单

终极ThinkPad风扇控制指南:TPFanCtrl2让散热管理变得简单 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 TPFanCtrl2是一款专为ThinkPad双风扇机型设计的智…

2026/8/6 1:10:30 阅读更多 →
深入解析ORA-01756错误:从字符集与数据清洗角度根治Oracle导入难题

深入解析ORA-01756错误:从字符集与数据清洗角度根治Oracle导入难题

1. 问题初现:一个看似简单的导入操作引发的“字符串终结”风波那天下午,我正在处理一个常规的数据迁移任务。需求很简单:将一个由业务部门提供的CSV文件,通过SQL*Loader脚本导入到Oracle数据库中。文件不大,也就几十万…

2026/8/6 1:09:30 阅读更多 →

日新闻

深入解析LimboAI C++内核:架构设计与性能优化实战

深入解析LimboAI C++内核:架构设计与性能优化实战

1. 项目概述:为什么我们需要深入LimboAI的C内核?如果你是一名使用Godot引擎的游戏开发者,尤其是对AI行为逻辑有较高要求的项目,那么LimboAI这个名字你大概率不会陌生。它作为Godot 4生态中一个备受瞩目的行为树与状态机插件&#…

2026/8/6 0:00:06 阅读更多 →
Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

1. 项目概述与核心思路大家好,我是老张,一个在游戏开发一线摸爬滚打了十多年的老码农。今天咱们接着聊《空洞骑士》风格2D动作游戏的Demo制作。上一期我们搭好了基础框架,处理了角色移动和碰撞,这一期,我们要让游戏世界…

2026/8/6 0:00:06 阅读更多 →
被动防火门市场前景发展趋势

被动防火门市场前景发展趋势

被动防火门依靠材质结构、密闭构造阻隔烟火蔓延,无需电控启动,是建筑被动消防系统核心构件,行业依托新规管控、城市更新、工业安全升级迎来稳定扩容,整体朝着合规化、专项化、低碳化、智能化方向发展。现阶段 GB12955‑2024 新版国…

2026/8/6 0:00:06 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/5 13:13:56 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/5 21:00:14 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →