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注解的本质是一种元数据,它们不会修改程序代码,而是提供了一些额外的信息。注解可以在源代码级别访问,可以帮助编写更好的文档和工具,同时还...