1:注解与注释的区别
注解会被编译,注释不会被编译;注解是写给JVM看的,注释是写给人看的方便理解代码。
2:经常使用注解
@Retention
Retention 的英文意为保留期的意思。当 @Retention 应用到一个注解上的时候,它解释说明了这个注解的的存活时间。
它的取值以下:
RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。注解默认使用这种方式。
RetentionPolicy.RUNTIME 注解能够保留到程序运行的时候,它会被加载进入到 JVM 中,因此在程序运行时能够获取到它们。所以能够使用反射机制读取该注解的信息。
@Documented
顾名思义,这个元注解确定是和文档有关。它的做用是可以将注解中的元素包含到 Javadoc 中去。
@Target
Target 是目标的意思,@Target 指定了注解运用的地方。
你能够这样理解,当一个注解被 @Target 注解时,这个注解就被限定了运用的场景。
@Target 有下面的取值
ElementType.ANNOTATION_TYPE 能够给一个注解进行注解
ElementType.CONSTRUCTOR 能够给构造方法进行注解
ElementType.FIELD 能够给属性进行注解
ElementType.LOCAL_VARIABLE 能够给局部变量进行注解
ElementType.METHOD 能够给方法进行注解
ElementType.PACKAGE 能够给一个包进行注解
ElementType.PARAMETER 能够给一个方法内的参数进行注解
ElementType.TYPE 能够给一个类型进行注解,好比类、接口、枚举
@Inherited
Inherited 是继承的意思,可是它并非说注解自己能够继承,而是说若是一个超类被 @Inherited 注解过的注解进行注解的话,那么若是它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解。
@Repeatable
Repeatable 天然是可重复的意思。@Repeatable 是 Java 1.8 才加进来的,因此算是一个新的特性。
3:注解的写法java
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;.net
@Retention(RUNTIME)
@Target({ TYPE, FIELD, METHOD })
public @interface TestAnnotation {
int age() default 18;
String name() default "sam";
}
4:注解的使用
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import com.company.demo.annotation.TestAnnotation;继承
public class Test10 {
public static void main(String[] args) {
AnnotationTest ann = new AnnotationTest();
Class cls = ann.getClass();
Method[] methods = cls.getDeclaredMethods();
for(Method m:methods) {
if(m.isAnnotationPresent(TestAnnotation.class)) {
try {
TestAnnotation test = m.getAnnotation(TestAnnotation.class);
m.invoke(ann, 0,"wang");
System.out.println("age=:"+test.age());
System.out.println("name=:"+test.name());
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}接口
}文档
}
class AnnotationTest{
@TestAnnotation(name="lily",age=18)
String name;
int age;
@TestAnnotation(name="lily",age=18)
void sayhello(int weight,String color) {
System.out.println("hello world!"+weight+color);
}
void sayName() {
System.out.println("hello my name is sam!");
}
}get