简单注解学习
问题
- 注解应该怎么写?
- 注解怎么运行?
注解开发
基本形式
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Demo {
String name();
String description() default "这是默认描述";
}
- 用@interface 定义注解
- 注解也相当于是接口,所以里面要写方法也是注解的属性
- 可以看到定义的注解上还有两个注解
深入认识注解
java 内置了3种标准注解(@Override, @Deprcated, @SuppressWarning) 和4种元注解(@Target @Retention @Documented @Inherited)
元注解:
@Target | CONSTRUCTOR:构造器的声明 |
---|---|
(表示注解用在什么地方,El ementedType参数如右) | FIELD:域的声明(类中的参数,包括实例) |
LOCAL_VARIABLE:局部变量声明 | |
METHOD:方法声明 | |
PACKAGE:包声明 | |
PARAMETER:参数声明 | |
TYPE:类、接口(包括注解)或enmu声明 | |
@Retention | SOURCE:注解被编译器丢弃 |
(表示在什么级别保存注解,RetentionPolicy参数如右) | CALSS:注解在class文件中可用,但会被jvm丢弃 |
RUNTIME:jvm在运行时期也会保留,因此可以通过放射机制读取注解的信息 | |
@Documented | 将此注解包含在Javadoc中 |
@Inherited | 允许子类继承父类中的注解 |
让注解运行起来
public class DemoTest {
@Demo(name = "lgd")
public void method1(){
System.out.println("这是方法1");
}
@Demo(name = "shadow", description = "你好,我是shadow")
public void method2(){
System.out.println("这是方法2");
}
public void method3(){
System.out.println("这是方法3");
}
}
public class DemoMain {
public static void main(String[] args) {
DemoTest demoTest = new DemoTest();
Class c = demoTest.getClass();
Method [] methods = c.getDeclaredMethods();
for (Method method: methods) {
System.out.println("类中的方法:"+method.getName());
if (method.isAnnotationPresent(Demo.class)){
Demo d = method.getAnnotation(Demo.class);
System.out.println("添加了注解的方法:"+method.getName()+" 注解参数: name-"+d.name()+" decription-"+d.description());
}
}
}
}
类中的方法:method2
添加了注解的方法:method2 注解参数: name-shadow decription-你好,我是shadow
类中的方法:method3
类中的方法:method1
添加了注解的方法:method1 注解参数: name-lgd decription-这是默认描述
这样注解就被运行起来了
注解可用类型
注解中方法返回类型或者说属性类型的可用类型:
- String
- Class
- enum
- Annotation
- 以上类型的数组