在上一篇文章中介绍了注解的原理和适用场景,这一篇开始如何自定义Annotation。
Annotation是不同于Class、Interface、Enum,使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。
1、自定义MyAnnotation
package com.example.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; //@Target({ElementType.METHOD}) @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { String name() default "abc"; //指定 默认值 int age(); float[] grade(); }
注意:注解是不能继承的
2、使用MyAnnotation
@MyAnnotation(name="aaa",age=24,grade={84.5f,90.0f}) public boolean isPermitted(){ return false; }
3、利用反射获取注解的属性值
package com.example.annotation; import java.lang.reflect.Method; import java.sql.Connection; public class JdbcUtils { public static void main(String[] args) { getConnection(); } @DbInfo(driver="com.mysql.jdbc.Driver",url="jdbc:mysql:///test",user="root",password="root") public static Connection getConnection(){ // Class clazz = JdbcUtils.class; try { Class clazz = Class.forName("com.example.annotation.JdbcUtils"); //方法1 Method[] methods = clazz.getMethods(); for (Method method : methods) { if(method.isAnnotationPresent(DbInfo.class)){ //判断该方法上是否有DbInfo注解 DbInfo info = (DbInfo)method.getAnnotation(DbInfo.class); System.out.println("Method["+method.getName()+"],driver["+info.driver()+"],url["+info.url()+"],user["+info.user()+"],password["+info.password()+"]"); } } //方法2 Method method = clazz.getMethod("getConnection", null); DbInfo dbInfo = method.getAnnotation(DbInfo.class); if(dbInfo!=null){ System.out.println("Method["+method.getName()+"],driver["+dbInfo.driver()+"],url["+dbInfo.url()+"],user["+dbInfo.user()+"],password["+dbInfo.password()+"]"); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } return null; } }