java注解编程_Java注解

776e71d35e8b5eb8b9f04cbf6ea57573.png

Java注解Annotation

元注解

@Retention

保留期,当@Retention应用到一个注解上,说明了这个注解的存活时间。

RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视

RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到JVM中

RetentionPolicy.RUNTIME注解可以保留到程序运行的时候,会被加载到JVM中,程序运行时可以获取

@Retention(RetentionPolicy.RUNTIME)

public @interface TestAnnotation {

}

@Documented

作用:能够将注解中的元素包含到Javadoc中去

@Target

指定了注解运用的地方,被@Target注解的注解就被限定了运用的场景

ElementType.ANNOTATION_TYPE 可以给一个注解进行注解

ElementType.CONSTRUCTOR 可以给构造方法进行注解

ElementType.FIELD 可以给属性进行注解

ElementType.LOCAL_VARIABLE 可以给局部变量注解

ElementType.METHOD 方法

ElementType.PACKAGE 包

ElementType.PARAMETER 方法内的参数

ElementType.TYPE 类型 比如类、接口、枚举

@Inherited

继承,注解 Test 被 @Inherited 修饰,之后类 A 被 Test 注解,类 B 继承 A,类 B 也拥有 Test 这个注解。

@Repeatable

可重复,注解的值可以同时取多个

@interface Persons {

Person[] value();

}

@Repeatable(Persons.class)//@Repeatable后面括号中的类相当于一个容器注解,即用于存放其他注解的地方,本身也是注解

@interface Person{

String role default "";

}

@Person(role="artist")

@Person(role="coder")

@Person(role="PM")

public class SuperMan{

}

//Persons 是一张总的标签,上面贴满了 Person 这种同类型但内容不一样的标签。把 Persons 给一个 SuperMan 贴上,相当于同时给他贴了程序员、产品经理、画家的标签。

注解的属性

AKA成员变量,注解只有成员变量,没有方法。

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

public @interface TestAnnotation {

int id();

String msg();

}

//定义了TestAnnotation这个注解中两个属性

//赋值方式

@TestAnnotation(id=3,msg="hello annotation")

public class Test {

}

//如果一个注解没有任何属性

public @interface Perform{}

//在应用这个注解的时候,括号都可以省略

@Perform

Public void testMethod(){}

Java预置的注解

@Deprecated

标记过时的元素

@Override

提示子类要复写父类中被@Override修饰的方法

@SuppressWarnings

组织警告,之前说过调用被 @Deprecated 注解的方法后,编译器会警告提醒,而有时候开发者会忽略这种警告,他们可以在调用的地方通过 @SuppressWarnings 达到目的。

@FunctionalInterface

函数式接口注解,函数式接口就是一个具有一个方法的普通接口

@FunctionalInterface

public interface Runnable{

public abstrct void run();

}

注解与反射

注解通过反射获取

@TestAnnotation()

public class Test {

public static void main(String[] args) {

//首先可以通过 Class 对象的 isAnnotationPresent() 方法判断它是否应用了某个注解

boolean hasAnnotation = Test.class.isAnnotationPresent(TestAnnotation.class);

if ( hasAnnotation ) {

//然后通过 getAnnotation() 方法来获取 Annotation 对象。

TestAnnotation testAnnotation = Test.class.getAnnotation(TestAnnotation.class);

System.out.println("id:"+testAnnotation.id());//返回指定类型的注解

System.out.println("msg:"+testAnnotation.msg());

}

}

总结

注解相当于标签,标签为了解释事物,注解为了解释代码

注解的基本语法,创建如同接口,但是多了@符号

注解主要给编译器及工具类型的软件用的

注解的提取需要借助于Java的反射技术,反射比较慢,所以使用注解时需要计较时间成本

Java注解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值