1.注解相关概念

注解(Annotation)是代码里的特殊标记,程序可以读取注解,一般用于替代配置文件。

可以通过反射技术得到类的注解,以控制类的运行方式。

创建注解使用@interface关键字,注解中只能包含属性。

注解的属性可以使用的类型:字符串、基本数字类型、Class、Enum、Annotation,以上类型的一维数组。

 

2.创建注解

1 package com.example.anno;
2 
3 public @interface MyAnnotation {
4     //只能包含属性
5     String name();
6     
7     int age() default 18;
8 }
 1 package com.example.anno;
 2 
 3 import com.example.eum.Gender;
 4 
 5 public @interface MyAnnotation2 {
 6     String value();
 7     
 8     int num() default 2;
 9     
10 //    Class<?> class1();
11 //    
12 //    Gender gender();
13 //    
14 //    MyAnnotation anno1();
15 }
 1 package com.example.anno;
 2 
 3 //注解写在类上
 4 @MyAnnotation(name = "张三", age = 20)
 5 public class Person {
 6     
 7     //注解写在方法上,使用默认值
 8     @MyAnnotation(name = "张三")
 9     public void show() {
10         
11     }
12     
13     @MyAnnotation2(value="鸡肉")    
14     public void eat() {
15         
16     }
17 }

注解的本质是一个继承了Annotation的interface,注解的属性会被转换为方法。

 

3.使用反射获取注解信息

 1 package com.example.anno;
 2 
 3 import java.lang.annotation.ElementType;
 4 import java.lang.annotation.Retention;
 5 import java.lang.annotation.RetentionPolicy;
 6 import java.lang.annotation.Target;
 7 
 8 //元注解,
 9 //@Retention(RetentionPolicy.CLASS)// 默认,运行的时候注解就不存在了
10 @Retention(RetentionPolicy.RUNTIME) // jvm级别
11 //@Retention(RetentionPolicy.SOURCE) // 编译时直接丢弃
12 
13 @Target(value = { 
14         ElementType.ANNOTATION_TYPE,
15         ElementType.CONSTRUCTOR,
16         ElementType.FIELD,
17         ElementType.LOCAL_VARIABLE,
18         ElementType.METHOD,
19         ElementType.PACKAGE,
20         ElementType.TYPE,
21         ElementType.TYPE_PARAMETER,
22         ElementType.TYPE_USE })
23 
24 public @interface PersonInfo {
25     String name();
26 
27     int age();
28 
29     String sex();
30 }
 1 package com.example.anno;
 2 
 3 //注解写在类上
 4 @MyAnnotation(name = "张三", age = 20)
 5 public class Person {
 6 
 7     // 注解写在方法上,使用默认值
 8     @MyAnnotation(name = "张三")
 9     public void show() {
10 
11     }
12 
13     @MyAnnotation2(value = "鸡肉")
14     public void eat() {
15 
16     }
17 
18     @PersonInfo(name = "张三", age = 20, sex = "男")
19     public void show(String name, int age, String sex) {
20         System.out.println(name + "--" + age + "--" + sex);
21     }
22 }
 1 package com.example.anno;
 2 
 3 import java.lang.annotation.Annotation;
 4 import java.lang.reflect.Method;
 5 
 6 public class Demo {
 7 
 8     public static void main(String[] args) throws Exception {
 9         // TODO Auto-generated method stub
10         Class<?> cp = Class.forName("com.example.anno.Person");
11         Method m = cp.getMethod("show", String.class, int.class, String.class);
12         PersonInfo pi = m.getAnnotation(PersonInfo.class);
13         System.out.println(pi.name() + "--" + pi.age() + "--" + pi.sex());
14 
15         Person p = (Person) cp.newInstance();
16         m.invoke(p, pi.name(), pi.age(), pi.sex());
17     }
18 }

 

posted on 2021-02-07 17:23  Sempron2800+  阅读(61)  评论(0编辑  收藏  举报