java自定义注解
Java注解
Annotation(注解)是JDK5.0及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注解、单值注解、完整注解三类。它们都不会直接影响到程序的语义,只是作为注解(标识)存在,我们可以通过反射机制编程实现对这些元数据(用来描述数据的数据)的访问。另外,你可以在编译时选择代码里的注解是否只存在于源代码级,或者它也能在class文件中出现。
在写代码过程常遇到的注解有@Override、@SuppressWarnings,@Override注解表示重写父类方法,、@SuppressWarnings注解表示忽略警告信息
关于四个作用相同注解
@Component("info") 不分层
@Repository("info") dao
@Service("info") biz
@Controller("info") action
@Value() 在一个类中注入普通属性值
@Resource 在一个类中注入域属性
@Autowired 在一个类中注入域属性
注解(Annotation)自定义注解入门
元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。Java5.0定义的元注解:
1.@Target,
2.@Retention,
3.@Documented,
4.@Inherited
这些类型和它们所支持的类在java.lang.annotation包中可以找到。下面我们看一下每个元注解的作用和相应分参数的使用说明。
@Target:
@Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。
作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
取值(ElementType)有:
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。
定义注解格式:
public @interface 注解名 {定义体}
注解参数的可支持数据类型:
1.所有基本数据类型(int,float,boolean,byte,double,char,long,short)
2.String类型
3.Class类型
4.enum类型
5.Annotation类型
6.以上所有类型的数组
自定义注解案例:
1.自定义注解
1 @Target(ElementType.METHOD) 2 @Retention(RetentionPolicy.RUNTIME) 3 @Documented 4 public @interface Apple { 5 String name(); 6 String sex() default "男"; 7 String phone() default "15931787945"; 8 int age() default 2; 9 }
2.使用注解的类:
1 public class AppleTest { 2 @Apple(name="张朵朵") 3 public void show(){ 4 5 } 6 }
3.提取注解参数:
1 public class Test20171010{ 2 @Test 3 public void test01(){ 4 Class<AppleTest> appleTestClass = AppleTest.class; 5 try { 6 Apple show = appleTestClass.getMethod("show").getAnnotation(Apple.class); 7 System.out.println(show.name()); 8 System.out.println(show.sex()); 9 System.out.println(show.phone()); 10 System.out.println(show.age()); 11 } catch (NoSuchMethodException e) { 12 e.printStackTrace(); 13 } 14 } 15 }
执行结果: