什么是Java注解和反射

发布时间:2021-10-11 17:26:21 作者:iii
来源:亿速云 阅读:142

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

什么是Java注解和反射

什么是注解

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

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

注解与注释的区别:

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

注解的使用场景

编译格式检查

反射中解析

生成帮助文档

跟踪代码依赖

注解的作用

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

注解的分类

标准注解

什么是Java注解和反射

元注解

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

什么是Java注解和反射

Target补充:

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

  取值(ElementType)有:

  1.CONSTRUCTOR:用于描述构造器

  2.FIELD:用于描述域

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

  4.METHOD:用于描述方法

  5.PACKAGE:用于描述包

  6.PARAMETER:用于描述参数

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

自定义注解

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

分析:

@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 进行反射调用:

什么是Java注解和反射

什么是Java注解和反射

结果:

什么是Java注解和反射

上面两段代码的执行结果,其实是完全一样的。但是其思路完全不一样,第一段代码在未运行时就已经确定了要运行的类(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 Uclass1=Class.forName(“com.znb.entity.User”);

Class Uclass2= User.class;

User user=new User();

Class Uclass3=user.getClass();

什么是Java注解和反射

结果:

什么是Java注解和反射

通过反射创建类对象

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

Class uclass= User.class;

User user= (User) uclass.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”);

什么是Java注解和反射

什么是Java注解和反射

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

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

什么是Java注解和反射

结果:

什么是Java注解和反射

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

什么是Java注解和反射

结果:

什么是Java注解和反射

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

反射应用场景

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

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

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

性能分析

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

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

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

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

推荐阅读:
  1. 什么是反射和字节码对象。
  2. .net中什么是反射

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:Python中如何实现操作系统兼容性打包

下一篇:如何巧用二进制让性能提升100倍,让存储空间减少100倍

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》