千家信息网

什么是Java注解和反射

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍"什么是Java注解和反射",在日常操作中,相信很多人在什么是Java注解和反射问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"什么是Java注解和反射"
千家信息网最后更新 2026年11月02日什么是Java注解和反射

这篇文章主要介绍"什么是Java注解和反射",在日常操作中,相信很多人在什么是Java注解和反射问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"什么是Java注解和反射"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

什么是注解

Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。

Java 语言中的类、方法、变量、参数和包等都可以被标注。和注释不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行 时可以获取到标注内容 。当然它也支持自定义 Java 标注。

注解与注释的区别:

注解是给机器看的注释,而注释是给程序员看的提示,编译时自动忽略注释。

注解的使用场景

编译格式检查

反射中解析

生成帮助文档

跟踪代码依赖

注解的作用

  • 作为特定的标记, 告知编译器一些信息. 例如方法的@Override 注解, 用于编译器去检验方法的重写是否符合规范.

  • 编译时动态处理, 例如动态生成代码, 例如Lombok提供的一些注解@Data, 来动态的生成getter setter toString 等等方法

  • 运行时动态处理, 作为额外的信息载体,例如@Controller层的请求映射的路径

一个注解最重要的是解析这个注解的代码, 否则这个注解就没有连注释都不如.

注解的分类

  • 标准注解: Override(方法重写) Deprecated(过时的) SuppressWarings(忽略某些警告)

  • 元注解: @Target @Retention @Inherited @Documented 这些注解的作用是用于定义注解的注解

  • 自定义注解

标准注解

元注解

定义:
作用在其他注解的注解

Target补充:

  作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)

  取值(ElementType)有:

  1.CONSTRUCTOR:用于描述构造器

  2.FIELD:用于描述域

  3.LOCAL_VARIABLE:用于描述局部变量

  4.METHOD:用于描述方法

  5.PACKAGE:用于描述包

  6.PARAMETER:用于描述参数

  7.TYPE:用于描述类、接口(包括注解类型) 或enum声明

  • 子类会继承父类使用的注解中被@Inherited修饰的注解

  • 接口继承关系中,子接口不会继承父接口中的任何注解,不管父接口中使用的注解有没有 被@Inherited修饰

  • 类实现接口时不会继承任何接口中定义的注解

自定义注解

使用 @interface 自定义注解时,自动继承了 java.lang.annotation.Annotation 接口

分析:

  • @interface 用来声明一个注解,格式:public @interface 注解名 {定义内容}

  • 其中的每一个方法实际上是声明了一个配置参数 方法的名称就是参数的名称

  • 返回值类型就是参数的类型(返回值只能是基本类型,Class,String,enum) 可以通过 default 来声明参数的默认值

  • 如果只有一个参数成员,一般参数名为 value 注解元素必须要有值,我们定义注解元素时,经常使用空字符串,0 作为默认值

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

public @interface AutoWired {

}

反射

静态语言 VS 动态语言

动态语言

动态语言是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其它结构上的变化。通俗一点说就是在运行时代码可以根据某些条件改变自身结构

静态语言

与动态语言相对应,运行时结构不可变的语言就是静态语言,如 Java、C、C++

Java 不是静态语言,但是 Java 可以称之为 "准动态语言"。即 Java 有一定的动态性,我们可以利用反射机制获得类似动态语言的特性。Java 的动态性让编程的时候更加灵活

Java 反射机制概述

  反射之中包含了一个「反」字,所以想要解释反射就必须先从「正」开始解释。

一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的。于是我们直接对这个类进行实例化,之后使用这个类对象(见后文)进行操作

Student student= new Student (); //直接初始化,「正射」

student.setAge(14);

上面这样子进行类对象的初始化,我们可以理解为「正」。

而反射则是一开始并不知道我要初始化的类对象是什么,自然也无法使用 new 关键字来创建对象了。

这时候,我们使用 JDK 提供的反射 API 进行反射调用:

结果:

上面两段代码的执行结果,其实是完全一样的。但是其思路完全不一样,第一段代码在未运行时就已经确定了要运行的类(Apple),而第二段代码则是在运行时通过字符串值才得知要运行的类(com.chenshuyi.reflect.Apple)。

从这个简单的例子可以看出,一般情况下我们使用反射获取一个对象的步骤:

1.获取类的 Class 对象实例

Class clz = Class.forName("com.znb.entity.User");

2.根据 Class 对象实例获取 Constructor 对象

Constructor constructor = clz.getConstructor();

3.使用 Constructor 对象的 newInstance 方法获取反射类对象

Object object = constructor.newInstance();

4.获取方法的 Method 对象

Method method1 = clz.getMethod("setId", int.class);

Method method2 = clz.getMethod("setPassword", String.class);

Method method3 = clz.getMethod("setUsername", String.class);

5.利用 invoke 方法调用方法

method1.invoke(object, 40);

method2.invoke(object, "777444");

method3.invoke(object, "555666");

到这里,我们已经能够掌握反射的基本使用。但如果要进一步掌握反射,还需要对反射的常用 API 有更深入的理解。

在 JDK 中,反射相关的 API 可以分为下面几个方面:获取反射的 Class 对象、通过反射创建类对象、通过反射获取类属性方法及构造器。

反射常用API

获取反射中的Class对象

在反射中,要获取一个类或调用一个类的方法,我们首先需要获取到该类的 Class 对象。

在 Java API 中,获取 Class 类对象有三种方法:

  • 使用 Class.forName 静态方法。当你知道该类的全路径名时,你可以使用该方法获取 Class 类对象。

Class Uclass1=Class.forName("com.znb.entity.User");

  • 使用 .class 方法。

Class Uclass2= User.class;

  • 使用类对象的 getClass() 方法。

User user=new User();

Class Uclass3=user.getClass();

结果:

通过反射创建类对象

通过反射创建类对象主要有两种方式:通过 Class 对象的 newInstance() 方法、通过 Constructor 对象的 newInstance() 方法。

  • 通过 Class 对象的 newInstance() 方法。

Class uclass= User.class;

User user= (User) uclass.newInstance();

  • 通过 Constructor 对象的 newInstance() 方法

Class uclass= User .class;

Constructor constructor = uclass.getConstructor();

User user= (User )constructor.newInstance();

通过 Constructor 对象创建类对象可以选择特定构造方法,而通过 Class 对象则只能使用默认的无参数构造方法。下面的代码就调用了一个有参数的构造方法进行了类对象的初始化。

Class uclass= User .class;

Constructor constructor = uclass.getConstructor(

int.class,String.class,String.class);

User user= (User )constructor.newInstance(1, "555","888");

通过反射获取类属性、方法、构造器

我们通过 Class 对象的 getFields() 方法可以获取 Class 类的属性,但无法获取私有属性。

结果:

而如果使用 Class 对象的 getDeclaredFields() 方法则可以获取包括私有属性在内的所有属性

结果:

与获取类属性一样,当我们去获取类方法、类构造器时,如果要获取私有方法或私有构造器,则必须使用有 declared 关键字的方法。

反射应用场景

  • Java的反射机制在做基础框架的时候非常有用,有一句话这么说来着:反射机制是很多Java框架的基石。而一般应用层面很少用,不过这种东西,现在很多开源框架基本都已经给你封装好了,自己基本用不着写。典型的除了Hibernate之外,还有Spring也用到很多反射机制。经典的就是在xml文件或者properties里面写好了配置,然后在Java类里面解析xml或properties里面的内容,得到一个字符串,然后用反射机制,根据这个字符串获得某个类的Class实例,这样就可以动态配置一些东西,不用每一次都要在代码里面去new或者做其他的事情,以后要改的话直接改配置文件,代码维护起来就很方便了,同时有时候要适应某些需求,Java类里面不一定能直接调用另外的方法,这时候也可以通过反射机制来实现。

总的来说,自己写的很少,具体什么时候要用那要看需求,反射机制无非就是根据一个String来得到你要的实体对象,然后调用它原来的东西。但是如果是要自己写框架的话,那就会用得比较多了。

  • 当你做一个软件可以安装插件的功能,你连插件的类型名称都不知道,你怎么实例化这个对象呢?因为程序是支持插件的(第三方的),在开发的时候并不知道。所以无法在代码中 New出来 ,但反射可以,通过反射,动态加载程序集,然后读出类,检查标记之后再实例化对象,就可以获得正确的类实例。

  • 在编码阶段不知道那个类名,要在运行期从配置文件读取类名, 这时候就没有办法硬编码newClassName(),而必须用到反射才能创建这个对象.反射的目的就是为了扩展未知的应用。比如你写了一个程序,这个程序定义了一些接口,只要实现了这些接口的dll都可以作为插件来插入到这个程序中。那么怎么实现呢?就可以通过反射来实现。就是把dll加载进内存,然后通过反射的方式来调用dll中的方法。很多工厂模式就是使用的反射。

程序员在自己的业务开发中应该尽量的远离反射

反射:在流行的库如Spring和Hibernate中,反射自然有其用武之地。不过内省业务代码在很多时候都不是一件好事,原因有很多,一般情况下我总是建议大家不要使用反射。

性能分析

反射机制是一种程序自我分析的能力。用于获取一个类的类变量,构造函数,方法,修饰符。

优点:运行期类型的判断,动态类加载,动态代理使用反射。

缺点:性能是一个问题,反射相当于一系列解释操作,通知jvm要做的事情,性能比直接的java代码要慢很多。

到此,关于"什么是Java注解和反射"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

反射 注解 方法 对象 动态 代码 语言 参数 接口 机制 就是 运行 程序 实例 属性 注释 类型 编译 内容 时候 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 深圳市人人互联网科技有限公司 互联网科技财经 互联网络科技有限公司 润盈互联网科技 卓越科技互联网 招聘 中国科技互联网公司收入 中国互联网有什么科技含量 银川新华互联网科技职业技术培训学校图片 昭通互联网科技选哪家 湖南一路畅行互联网科技 链环科技传统企业怎么转型互联网 深圳育鹏互联网科技有限公司招聘 互联网科技创新的路径 玉溪新华互联网科技好不好 美国互联网科技实力 广州燕处互联网科技有限公司 广东鹅鹅鹅互联网科技有限公司 云鲸互联网络科技有限公司 云南互联网科技学费 求路客互联网科技电话 互联网的科技创新 亿账通互联网科技 哈尔滨新华互联网科技学院 昭通互联网科技选哪家 智腾互联网科技有限公司 互联网科技公司有风险吗 注册互联网科技公司经营范围大全 深圳育鹏互联网科技有限公司招聘 想开互联网科技公司怎么样 上海互联网科技园景观
0