Java注解
annotation提供了四种元注解:
@Documented -- 注解是否将包含在javadoc中
@Retention --什么时候使用该注解
@Target 注解用于什么地方
@Inherited 是否允许资料基础该注解
RetentionPolicy.SOURCE 在编译阶段丢弃,不会写入字节码
RetentionPolicy.CLASS 在类加载时丢弃 注解默认使用这种
RetentionPolicy.RUNTIME 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息,自定义注解时常采用此种方式
@Target :
ElementType.TYPE
ElementType.FIELD
ElementType.METHOD
ElementType.PARAMETER
ElementType.CONSTRUCTOR
ElementType.LOCAL_VARIABLE
ElementType.ANNOTATION_TYPE
ElementType.PACKAGE
Annotations只支持基本类型、string及枚举类型。注解种的缩影的舒心被定义成发放,并允许提供默认值
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface Todo{
public enum Priority {LOW,HIGH}
public enum Status {YES, NO}
String author() default "Tim";
Priority pririty() default Priority.LOW;
Status status() default Status.NO;
}
@Todo(priority = Todo.Priority.MEDIUM, author = "yes", status = Todo.Status.NO)
public void incompleteMethod1(){
}
如果注解只有一个属性,可以直接命名value
@interface Author{
String value();
}
@Author("123")
public void someMethod(){}
通过使用反射机制自定义注解逻辑,现通过一个小示例
1、自定义注解
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface Compont { String identifier() default ""; }
2、应用自定义注解
@Compont(identifier="123") public class UpperCase { String toUpperCase(String str) { if(null != str) { return str.toUpperCase(); } return null; } }
3、 处理自定义注解
public class AnnotationMain { public static void main(String[] args) throws Exception{ Class<?> clzss = Class.forName("com.java.annotation.UpperCase"); boolean annotationBoolean = clzss.isAnnotationPresent(Compont.class); if(annotationBoolean) { Compont compont = (Compont)clzss.getAnnotation(Compont.class); String annotationResult = compont.identifier(); System.out.println(String.format("compont annotaion return result: %s", annotationResult)); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?