JAVA 注解原理

注解是一种特殊的接口

 

元注解

 

@Target 注解的作用目标。如字段、类、方法、注解等。

  • ElementType.TYPE:允许被修饰的注解作用在类、接口和枚举上
  • ElementType.FIELD:允许作用在属性字段上
  • ElementType.METHOD:允许作用在方法上
  • ElementType.PARAMETER:允许作用在方法参数上
  • ElementType.CONSTRUCTOR:允许作用在构造器上
  • ElementType.LOCAL_VARIABLE:允许作用在本地局部变量上
  • ElementType.ANNOTATION_TYPE:允许作用在注解上
  • ElementType.PACKAGE:允许作用在包上

 

@Retention 指当前注解的生命周期

 

  • RetentionPolicy.SOURCE:当前注解编译期可见,不会写入 class 文件
  • RetentionPolicy.CLASS:类加载阶段丢弃,会写入 class 文件
  • RetentionPolicy.RUNTIME:永久保存,可以反射获取

 

@Documented 执行javadoc打包时会被保存到doc文档中

 

@Inherited 是否具有继承性,注解的类的子类是否继承该该注解

 

 

1.在编译期间直接扫描的注解,如:

 

JDK三大注解

 

@override,会在编译时去查看是否真正的重写了父类方法;也就是在父类中是否存在同样的方法签名

 

@ Deprecated:标记当前方法、类等不再推荐使用。

 

@SuppressWarnings:压制java警告注解。value值为要压制的警告类型。

 

2.在运行期间反射。一般自定义注解是属于这类注解。

 

在运行期间,通过反射获取对象的元数据中存在注解信息。

 

注解在字节码中属性表:

  • RuntimeVisibleAnnotations:运行时可见的注解
  • RuntimeInVisibleAnnotations:运行时不可见的注解
  • RuntimeVisibleParameterAnnotations:运行时可见的方法参数注解
  • RuntimeInVisibleParameterAnnotations:运行时不可见的方法参数注解
  • AnnotationDefault:注解类元素的默认值

 

反射中跟注解相关的方法:

 

  • getAnnotation:返回指定的注解
  • isAnnotationPresent:判定当前元素是否被指定注解修饰
  • getAnnotations:返回所有的注解
  • getDeclaredAnnotation:返回本元素的指定注解
  • getDeclaredAnnotations:返回本元素的所有注解,不包含父类继承而来的

 

 

自定义注解通过JDK动态代理生成的代理类,通过Proxy.newProxyInstance调用执行的。

当生成代理类时,会传入被代理类的classLoader,代理的接口方法,和处理器。

InvocationHandler是接口实现处理器。他有很多实现,这里既然是代理注解,所以进入AnnotationInvocationHandler

下面这段代码是通过反射动态获取并修改属性的值。

 

Java注解(Annotation)是一种元数据,用于在程序中提供额外的信息但并不直接参与程序的运行。它们被用来标记代码元素,如类、方法、变量等,以便工具和构建系统能够读取这些信息并执行特定的行为。Java注解不改变源代码的实际功能,而是提供一种声明式的方式来传递上下文或配置。 注解的工作原理主要包括以下几个步骤: 1. **编写注解**:程序员在源代码中定义注解,如`@Override`、`@Deprecated`等,这些是Java标准库提供的预定义注解。 2. **编译期间处理**:当源代码经过Java编译器(javac)编译时,注解会被保留下来,但不会影响字节码。编译器会在注解的位置生成对应的字节码,包含注解的数据。 3. **解析注解**:使用诸如AspectJ、IntelliJ IDEA这样的工具或框架,在运行时或构建过程中读取和解析注解信息。例如,IDEA可以显示方法是否实现了某个接口的注解信息。 4. **自定义处理器**:开发者可以通过编写注解处理器(Annotation Processor),在编译时动态地处理注解,比如自动生成代码、验证约束等。 至于反编译,Java字节码(.class文件)是可以被反编译成源代码的,这通常用于调试、逆向工程或研究。有许多开源工具可供选择,如JD-GUI、Procyon或 FernFlower等。反编译后得到的源代码可能会失去一些注解相关的元数据,因为注解主要为编译器和特定工具设计,并非为人类阅读优化的文本形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值