Java注解
来源:互联网 发布:同济启明星软件价格 编辑:程序博客网 时间:2024/06/05 08:41
1. 简介
注解,java中提供了一种原程序中的元素关联任何信息、任何元素的途径的途径和方法。注解是那些插入到源代码中使用其他工具可以对其进行处理的标签。注解不会改变程序的编译方式。java编译器会对包含注解与不包含注解的代码生成相同的虚拟机指令。
2. 常用注解
@Override: 修饰重载父类方法;
@Deprecated: 修饰未来将被抛弃的类/方法/属性等等;
@SuppressWarnings: 关闭不当编译器警告信息。
3. 注解运行机制分类
源码注解: 注解只在源码中存在,编译成.class文件中不存在;
编译时注解: 注解存在于源码与.class中,运行时不存在;
运行时注解: 在所有阶段都存在,可以影响程序运行逻辑。
4. 注解来源分类
来自jdk的注解:如@Override/@Deprecated等等;
三方的注解: 如junit中的@Test/@Before等等;
自定义注解: 通过元注解自定义的注解。
5. 元注解
给注解进行注解,用于自定义注解。
@Target: 指明定义的注解的作用域,其值包括:
ElementType.CONSTRUCTOR: 构造方法声明;
ElementType.FIELD: 属性/字段声明;
ElementType.LOCAL_VARIABLE: 局部变量声明;
ElementType.METHOD: 方法声明;
ElementType.PACKAGE: 包声明;
ElementType.PARAMETER: 参数声明;
ElementType.TYPE: 类接口声明;
ElementType.ANNOTATION_TYPE: 注解类型声明;
ElementType.TYPE_PARAMETER: 类型参数声明(@since 1.8);
ElementType.TYPE_USE: 类型使用(@since 1.8)
@Retention: 自定义注解的生命周期,其值包括:
RetentionPolicy.SOURCE: 只在源码显示,编译时丢弃;
RetentionPolicy.CLASS: 编译时记录到.class中,运行时忽略;
RetentionPolicy.RUNTIME: 运行时存在,可通过反射来读取。
@Inherited: 一个标记注解,阐述了某个被标注的类型是被继承的,只能继承与类。
@Documented: 用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。
6. 自定义注解
//@Target(ElementType.METHOD)@Target({ElementType.METHOD,ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Inherited@Documentedpublic @interface Description { String desc() default ""; String author() default ""; int age() default 18;}
1.使用关键字@interface定义注解;
2.成员变量以无参无异常的方式声明;
3.可以通过default关键字给成员变量指定默认值;
4.成员变量的类型是受限制的,包括原始类型、String、Class、Annotation、Enumeration;
5.如果注解只有一个成员变量,则成员名称必须取名value(),在使用中可以忽略成员名称与赋值号(=);
6.注解可以没有成员,没有成员的注解称为标示注解。
/***********注解声明***************//** * 水果名称注解 * @author peida * */@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface FruitName { String value() default "";}/** * 水果颜色注解 * @author peida * */@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface FruitColor { /** * 颜色枚举 * @author peida * */ public enum Color{ BULE,RED,GREEN}; /** * 颜色属性 * @return */ Color fruitColor() default Color.GREEN;}/** * 水果供应者注解 * @author peida * */@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface FruitProvider { /** * 供应商编号 * @return */ public int id() default -1; /** * 供应商名称 * @return */ public String name() default ""; /** * 供应商地址 * @return */ public String address() default "";}/***********注解使用***************/public class Apple { @FruitName("Apple") private String appleName; @FruitColor(fruitColor=Color.RED) private String appleColor; @FruitProvider(id=1,name="陕西红富士集团",address="陕西省西安市延安路89号红富士大厦") private String appleProvider; public void setAppleColor(String appleColor) { this.appleColor = appleColor; } public String getAppleColor() { return appleColor; } public void setAppleName(String appleName) { this.appleName = appleName; } public String getAppleName() { return appleName; } public void setAppleProvider(String appleProvider) { this.appleProvider = appleProvider; } public String getAppleProvider() { return appleProvider; } public void displayName(){ System.out.println("水果的名字是:苹果"); }}/***********注解处理器***************/public class FruitInfoUtil { public static void getFruitInfo(Class<?> clazz){ String strFruitName=" 水果名称:"; String strFruitColor=" 水果颜色:"; String strFruitProvicer="供应商信息:"; Field[] fields = clazz.getDeclaredFields(); for(Field field :fields){ if(field.isAnnotationPresent(FruitName.class)){ FruitName fruitName = (FruitName) field.getAnnotation(FruitName.class); strFruitName=strFruitName+fruitName.value(); System.out.println(strFruitName); } else if(field.isAnnotationPresent(FruitColor.class)){ FruitColor fruitColor= (FruitColor) field.getAnnotation(FruitColor.class); strFruitColor=strFruitColor+fruitColor.fruitColor().toString(); System.out.println(strFruitColor); } else if(field.isAnnotationPresent(FruitProvider.class)){ FruitProvider fruitProvider= (FruitProvider) field.getAnnotation(FruitProvider.class); strFruitProvicer=" 供应商编号:"+fruitProvider.id()+" 供应商名称:"+fruitProvider.name()+" 供应商地址:"+fruitProvider.address(); System.out.println(strFruitProvicer); } } }}/***********输出结果***************/public class FruitRun { /** * @param args */ public static void main(String[] args) { FruitInfoUtil.getFruitInfo(Apple.class); }}
- Java注解-自定义注解
- Java注解----自定义注解
- Java注解自定义注解
- Java注解--四种元注解
- Java注解-三种內建注解
- 【Java】【注解】自定义注解
- java注解
- java注解
- java注解
- java 注解
- Java注解
- java 注解
- Java 注解
- Java注解
- java 注解
- JAVA注解
- Java注解
- Java注解
- ajax跨域设置django-cors-headers
- 盒子模型
- Vue filter computed watch 的用法
- C++字符串操作接口
- Python学习笔记(2)数据类型
- Java注解
- Python学习笔记(3)控制结构
- Spring框架之代理
- iOS-如何修改Xcode project的name?
- 7-类
- 15算法课程 9. Palindrome Number
- springboot junit 每天进步百分之一
- 【伪技术贴】无人驾驶?LEGO机器人就可以做到
- Android开发生成自己的Compile依赖