问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

java注解是怎么实现的?

发布网友 发布时间:2022-04-25 12:34

我来回答

3个回答

热心网友 时间:2022-04-09 11:33

//每个注解就是一个类
@注解接口类(接口属性=值)
//创建一个自定义注解
@Retention(RetentionPolicy.RUNTIME)    //运行时获得
@Target(ElementType.METHOD) //针对方法的注解
public @interface 自注标{
       int 属性1();
}
//注解加在自己的普通类上
class A{
  @自注标(属性1=123)   
   public void hello(){
   }
}
//在自己框架操作下游开发者的代码时,通过反射得到该注解的值123
自注标 a=A.getClass().getMethod("hello").getAnnotation(自注标.class);
int i=a.属性1();//就能获得用户注解值。进行相应的动作

热心网友 时间:2022-04-09 12:51

写一个使用该注解的类:
import java.io.IOException;

/**
* Created by Administrator on 2015/1/18.
*/
@TestAnnotation(count = 0x7fffffff)
public class TestMain {

public static void main(String[] args) throws InterruptedException, NoSuchFieldException, IllegalAccessException, IOException {
TestAnnotation annotation = TestMain.class.getAnnotation(TestAnnotation.class);
System.out.println(annotation.count());
System.in.read();
}

}

反编译一下这段代码:
Classfile /e:/workspace/intellij/SpringTest/target/classes/TestMain.class
Last modified 2015-1-20; size 1006 bytes
MD5 checksum a2d5367ea568240f078d5fb1de917550
Compiled from "TestMain.java"
public class TestMain
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #10.#34 // java/lang/Object."<init>":()V
#2 = Class #35 // TestMain
#3 = Class #36 // TestAnnotation
#4 = Methodref #37.#38 // java/lang/Class.getAnnotation:(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;
#5 = Fieldref #39.#40 // java/lang/System.out:Ljava/io/PrintStream;
#6 = InterfaceMethodref #3.#41 // TestAnnotation.count:()I
#7 = Methodref #42.#43 // java/io/PrintStream.println:(I)V
#8 = Fieldref #39.#44 // java/lang/System.in:Ljava/io/InputStream;
#9 = Methodref #45.#46 // java/io/InputStream.read:()I
#10 = Class #47 // java/lang/Object
#11 = Utf8 <init>
#12 = Utf8 ()V
#13 = Utf8 Code
#14 = Utf8 LineNumberTable
#15 = Utf8 LocalVariableTable
#16 = Utf8 this
#17 = Utf8 LTestMain;
#18 = Utf8 main
#19 = Utf8 ([Ljava/lang/String;)V
#20 = Utf8 args
#21 = Utf8 [Ljava/lang/String;
#22 = Utf8 annotation
#23 = Utf8 LTestAnnotation;
#24 = Utf8 Exceptions
#25 = Class #48 // java/lang/InterruptedException
#26 = Class #49 // java/lang/NoSuchFieldException
#27 = Class #50 // java/lang/IllegalAccessException
#28 = Class #51 // java/io/IOException
#29 = Utf8 SourceFile
#30 = Utf8 TestMain.java
#31 = Utf8 RuntimeVisibleAnnotations
#32 = Utf8 count
#33 = Integer 2147483647
#34 = NameAndType #11:#12 // "<init>":()V
#35 = Utf8 TestMain
#36 = Utf8 TestAnnotation
#37 = Class #52 // java/lang/Class
#38 = NameAndType #53:#54 // getAnnotation:(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;
#39 = Class #55 // java/lang/System
#40 = NameAndType #56:#57 // out:Ljava/io/PrintStream;
#41 = NameAndType #32:#58 // count:()I
#42 = Class #59 // java/io/PrintStream
#43 = NameAndType #60:#61 // println:(I)V
#44 = NameAndType #62:#63 // in:Ljava/io/InputStream;
#45 = Class #64 // java/io/InputStream
#46 = NameAndType #65:#58 // read:()I
#47 = Utf8 java/lang/Object
#48 = Utf8 java/lang/InterruptedException
#49 = Utf8 java/lang/NoSuchFieldException
#50 = Utf8 java/lang/IllegalAccessException
#51 = Utf8 java/io/IOException
#52 = Utf8 java/lang/Class
#53 = Utf8 getAnnotation
#54 = Utf8 (Ljava/lang/Class;)Ljava/lang/annotation/Annotation;
#55 = Utf8 java/lang/System
#56 = Utf8 out
#57 = Utf8 Ljava/io/PrintStream;
#58 = Utf8 ()I
#59 = Utf8 java/io/PrintStream
#60 = Utf8 println
#61 = Utf8 (I)V
#62 = Utf8 in
#63 = Utf8 Ljava/io/InputStream;
#64 = Utf8 java/io/InputStream
#65 = Utf8 read
{
public TestMain();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 7: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this LTestMain;

public static void main(java.lang.String[]) throws java.lang.InterruptedException, java.lang.NoSuchFieldException, java.lang.IllegalAccessException, java.io.IOException;
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=2, args_size=1
0: ldc #2 // class TestMain
2: ldc #3 // class TestAnnotation
4: invokevirtual #4 // Method java/lang/Class.getAnnotation:(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;
7: checkcast #3 // class TestAnnotation
10: astore_1
11: getstatic #5 // Field java/lang/System.out:Ljava/io/PrintStream;
14: aload_1
15: invokeinterface #6, 1 // InterfaceMethod TestAnnotation.count:()I
20: invokevirtual #7 // Method java/io/PrintStream.println:(I)V
23: getstatic #8 // Field java/lang/System.in:Ljava/io/InputStream;
26: invokevirtual #9 // Method java/io/InputStream.read:()I
29: pop
30: return
LineNumberTable:
line 10: 0
line 11: 11
line 12: 23
line 13: 30
LocalVariableTable:
Start Length Slot Name Signature
0 31 0 args [Ljava/lang/String;
11 20 1 annotation LTestAnnotation;
Exceptions:
throws java.lang.InterruptedException, java.lang.NoSuchFieldException, java.lang.IllegalAccessException, java.io.IOException
}
SourceFile: "TestMain.java"
RuntimeVisibleAnnotations:
0: #23(#32=I#33)

最后一行的代码说明,注解`TestAnnotation`的属性设置是在编译时就确定了的。(对属性的说明在[这里][1])。

然后,运行上面的程序,通过CLHSDB在eden区找到注解实例,

hsdb> scanoops 0x00000000e1b80000 0x00000000e3300000 TestAnnotation
0x00000000e1d6c360 com/sun/proxy/$Proxy1

类型`com/sun/proxy/$Proxy1`是jdk动态代理生成对象时的默认类型,其中
`com.sun.proxy`是默认的包名,定义于`ReflectUtil`类的`PROXY_PACKAGE`字段中。代理类名`$PROXY1`
包含两部分,其中前缀`$PROXY`是jdk种默认的代理类类名前缀(参见`java.lang.reflect.Proxy`类的javadoc),
后的1是自增的结果。

热心网友 时间:2022-04-09 14:26

eclipse
ctrl 点进去 before 可以看到源码的吧
java注解是怎么实现的

java // 定义注解 Retention // 注解保留至运行时 public @interface MyAnnotation { // 定义注解名称和元素 String value default ""; // 注解的元素定义,可以为空值 } 以上示例中,`MyAnnotation`是一个自定义注解,可以通过在代码中使用`@MyAnnotation`来标记需要特殊处理的代码片段。在实际应用...

java注解是怎么实现的?

java注解是怎么实现的?1、首先,在我们需要注入依赖的类中使用注解,如:publicclassMyService{InjectprivateMyDaodao;//...}在这个例子中,我们使用了@Inject注解来标注一个需要自动注入的属性dao。2、RetentionPolicy.RUNTIME–始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。...

java注解工作原理?

6importjava.lang.annotation.Target;7 8/ 9*定义一个注解 10 11 12*@authorjiqinlin 13 14*/ 15//Java中提供了四种元注解,专门负责注解其他的注解,分别如下 16 17//@Retention元注解,表示需要在什么级别保存该注释信息(生命周期)。可选的RetentionPoicy参数包括:18//RetentionPolicy.SOURCE:停...

Java 注解的工作原理以及如何创建自定义注解

- @FunctionalInterface - 元注解如@Retention和@Target 内置注解的影响内置注解不仅是元数据,它们影响代码行为,如编译验证和运行时反射。理解并有效使用这些注解是现代 Java 开发的基石。注解工作原理注解通过元数据形式附着于代码元素,涉及声明、处理和应用阶段,如动态代理和接口实现。结论Java 注解是提升...

JAVA注解是不是效率很低

原因:注解本质上通过反射来实现的,我们都知道,反射是一种程序的自省机制,其实反射是破坏封装的一种方式,反射的效率很低的,对程序本身访问会造成很多的额外开销。比如你采用Spring注解,@resource标识在一个类上面,那么程序会通过反射一遍遍的调用,首先通过class得到类对象,然后调取其中的getAnnotations...

java扫描自定义注解?

java注解是怎么实现的1、首先,在我们需要注入依赖的类中使用注解,如:publicclassMyService{InjectprivateMyDaodao;//...}在这个例子中,我们使用了@Inject注解来标注一个需要自动注入的属性dao。2、运行时注解,主要通过反射获取注解信息,在执行你想执行的代码编译期注解,在编译的时候,就已经处理过...

Java学习9_注解

Java注解是JDK5.0引入的一种注释机制,使用 "@注解名" 形式存在于代码中。注解相当于一种注释,让程序员在源文件中嵌入补充信息,而不改变原有逻辑。注解与单行、多行注释不同,其在JavaSE中的主要用途包括标记过时的功能和忽略警告等。在JavaEE/Android开发中,注解扮演更关键角色,用于配置应用切面,...

Java 什么是注解及注解原理详细介绍

1、注解是针对Java编译器的说明。可以给Java包、类型(类、接口、枚举)、构造器、方法、域、参数和局部变量进行注解。Java编译器可以根据指令来解释注解和放弃注解,或者将注解放到编译后的生成的class文件中,运行时可用。2、注解和注解类型 注解类型是一种特殊的接口类型,注解是注解注解类型的一个实例。...

深入浅出Java注解 / Java注解是如何工作的

给java注解下个定义 用一个词就可以描述注解,那就是元数据,即一种描述数据的数据。所以,可以说注解就是源代码的元数据。Annotation是一种应用于类、方法、参数、变量、构造器及包声明中的特殊修饰符。它是一种由JSR-175标准选择用来描述元数据的一种工具。注解的本质 Annotations仅仅是元数据,和业务...

java中注解是什么意思?

Java中的许多库和框架都使用了注解来实现某些功能,例如JUnit测试框架就使用注解标记测试方法和断言条件。通过使用注解,开发人员可以使代码更加清晰和易于维护。Java注解的本质是一种元数据,它们不会修改程序代码,而是提供了一些额外的信息。注解可以在源代码级别访问,可以帮助编写更好的文档和工具,同时还...

java自定义注解怎么实现注解 java被注解上的注解 java注解的实现原理 java的注解原理是什么 golang实现java注解 java注解实现 java注解底层实现 java开发中的注解自定义详解 java的注解
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
如何考电焊工证书和介绍 泰迪多大可以吃美毛粉 ...毛不是很密,长大后毛会密吗?假如不会有什么方法挽救? 吃美毛粉... 四个多月的泰迪需要吃美毛粉\'钙片\'营养膏之类的保健品吗?_百度知 ... 滚筒洗衣机需要安装洗衣机底座吗 关于电源o是开还是一是开(电源o是开还是一是开) 我帮单位运输柴油80升用铁桶装的,当时无证明,我不是车主,消防队查获交... 右脚脚脖子处起三个疙瘩很痒很痛 我的脚脖有几个像是蚊子咬的疙瘩,很痒 怎么做采购 java获取不到方法上的注解是什么原因 java自定义注解怎么获取注解的方法参数 如何获取java代码中的注释 Java 注解的读取注解信息的方法 java如何获取类上的注解 java反射机制 怎样获取到类上面的注解 java 获取所有带注解的类 请问深圳那有NewBalance纽巴伦的专卖? 如何用java 程序获取方法上的注释 java 如何获取方法的注释 求香港NewBalance(新百伦)球鞋的专卖店的详细地址,折扣店的也要!_百... java获取当前类上的注解内容 NewBalanceNB的篮球质量好吗,求介绍下? java 获取调用此方法的方法的注解 ABCbalance什么鞋 如何查询电信宽带套餐详情 newbalance 这个牌子英文怎么读呀? 如何在网上查询电信已开通的宽带业务 婊子俄语怎么说 谁能给我几句骂人的外语(日语,德语,韩语,俄语,法语都行,最好日语) tha... 如何java中程序如何得到@Id这样的注释 java 注解都有哪些东西? java 怎么获取注解中value的值 各位大神,求救!!!java 如何获取该类上字段的注解,看图片 java反射无法动态获取注解? 有没有有关龙虾做法的食谱。 水煮龙虾怎么做好吃! 怎么折龙虾 油闷大虾 怎么做{龙虾) 澳洲大龙虾死了还可以吃吗 吃小龙虾过敏而且脸上长红块儿用什么药?f 做小龙虾油炸多久才好 下列属于脊椎动物的是___;属于无脊椎动物的是___.属于恒温动物的是... 烧大龙虾的什么面条 进口美国波士顿龙虾关税多少 要多久清关出来 有谜语【谜底是搞笑的吗?】快快! 我家智能电视为什么装不了apk软件 系统提示,电视没装智能桌面APK是啥情况? 上海地区成考本科考公务员有机会过吗? 成人自考本科学历,实际初中文化水平,想考公务员考得上吗?