站长百科知识网

站长百科知识网

Java如何快速获取类附带的注解

大家好,感谢邀请,今天来为大家分享一下Java注释跑不起来是什么原因的问题,以及和java 注释 不建议使用的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!

本文目录

  1. 对于java语言来说,大量注释会影响执行效率么
  2. Java的注解是什么原理
  3. 怎样理解Java的注解并运用注解编程
  4. Java注释跑不起来是什么原因

对于java语言来说,大量注释会影响执行效率么

对的,众所周知Java是解释执行,当你写了越多注释,则需要解释的字符串也越多,自然效率浪费的也越多,对于一般的编程语言来说,注释在编译的时候会忽略不计,但是对java来说它是解释注释操的。注释得越多,需要解释答字符串也就越多,所以一个基本原则就是,Java代码要写的越短越好,可惜由于语言设计原因,Java代码一般都很长,所以很多人对Java的执行效率不满。

Java的注解是什么原理

首先,从一个简单的注解开始,@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

public@interfaceTest{

Stringvalue()default"";

}

使用javap-verbose命令查看这个注解的class文件,发现这个注解被编译成了接口,并且继承了java.lang.annotation.Annotation接口,接口是不能直接实例化使用的,当在代码中使用这个注解,并使用getAnnotation方法获取注解信息时,JVM通过动态代理的方式生成一个实现了Test接口的代理对象实例,然后对该实例的属性赋值,value值就存在这个代理对象实例中。

如果顺着getAnnotation方法继续跟踪源代码,会发现创建代理对象是在AnnotationParser.java中实现的,这个类中有一个annotationForMap方法。在annotationForMap方法内部使用Proxy.newProxyInstance方法在运行时动态创建代理,AnnotationInvocationHandler实现了InvocationHandler接口,当调用代理对象的value()方法获取注解的value值,就会进入AnnotationInvocationHandler类中的invoke方法,深入invoke方法会发现,获取value值最终是从AnnotationInvocationHandler类的memberValues属性中获取的,memberValues是一个Map类型,key是注解的属性名,这里就是“value”,value是使用注解时设置的值。

因为回答中不能插入源码做讲解辅助,更多详细内容可以关注『Java实战技术』主页的原创文章《Java注解是如何玩转的,面试官和我聊了半个小时》。

怎样理解Java的注解并运用注解编程

一、什么是注解

注解也叫元数据,例如我们常见的@Override和@Deprecated,注解是JDK1.5版本开始引入的一个特性,

用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。

一般常用的注解可以分为三类:

1、Java自带的标准注解,包括@Override(标明重写某个方法)、@Deprecated(标明某个类或方法过时)和@SuppressWarnings(标明要忽略的警告),使用这些注解后编译器就会进行检查。

2、类为元注解,元注解是用于定义注解的注解,包括@Retention(标明注解被保留的阶段)、@Target(标明注解使用的范围)、@Inherited(标明注解可继承)、@Documented(标明是否生成javadoc文档)

3、类为自定义注解,可以根据自己的需求定义注解

二、注解的用途

在看注解的用途之前,有必要简单的介绍下XML和注解区别,

注解:是一种分散式的元数据,与源代码紧绑定。

xml:是一种集中式的元数据,与源代码无绑定

当然网上存在各种XML与注解的辩论哪个更好,这里不作评论和介绍,主要介绍一下注解的主要用途:

生成文档,通过代码里标识的元数据生成javadoc文档。

编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证。

编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码。

运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例

三、注解的实现原理

实现注解三要素:

1、注解声明

2、使用注解的元素

3、操作注解使其起作用(注解处理器)

注解声明

首先我们让看一下java中的元注解(也就是上面提到的注解的注解),总共有4个如下:

@Target,@Retention,@Documented,@Inherited这4个元注解都是在jdk的java.lang.annotation包下面,

@Target:Target说明的是Annotation所修饰的对象范围。@Retention:

定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,

而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。

使用这个元注解可以对Annotation的“生命周期”限制。@Documented:@Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员

@Inherited:@Inherited元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,

则这个annotation将被用于该class的子类。

注意:@Inheritedannotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。

当@Inheritedannotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继承性。如果我们使用java.lang.reflect去查询一个@Inheritedannotation类型的annotation时,

反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层。

java.lang.reflect.AnnotatedElement接口是所有程序元素(Class、Method和Constructor)的父接口,所以程序通过反射获取了某个类的AnnotatedElement对象之后,程序就可以调用该对象的如下四个个方法来访问Annotation信息:

方法1:<TextendsAnnotation>TgetAnnotation(Class<T>annotationClass):返回改程序元素上存在的、指定类型的注解,如果该类型注解不存在,则返回null。

方法2:Annotation[]getAnnotations():返回该程序元素上存在的所有注解。

方法3:booleanisAnnotationPresent(Class<?extendsAnnotation>annotationClass):判断该程序元素上是否

Java注释跑不起来是什么原因

你说的是普通注释还是注解?注释肯定是跑不起来的呀!java中,注解本身不会做什么事,专门的注解执行类根据注解去执行。注解本质上相当于一个标记,另外的专门的类根据此标记做具体的事。你看看你的注解会保存到什么时候,有没有注解执行类。

关于Java注释跑不起来是什么原因的内容到此结束,希望对大家有所帮助。

推荐一款 Java 零注解 API 文档生成工具

标签:# 是什么原因# 注释# 我的# 不起来# 网站