java注解
自JDK1.5之后引入注解之后,各个框架中都提供了支持注解的方式。在日常开发中慢慢的将XML许多的配置转换成注解,经常的使用
甚至陶sir在定义日终类的时候,自定义了注解:@Trigger 和 @TargetMethod 以作使用。可见注解的易用性和广泛性。
这边对注解做一些了解
元注解:在jdk中提供了 为自定义注解 所需要的几个元注解:
@interface : 用于定义注解
@Target :用于描述注解的使用范围 大致有 method(方法) field(属性) type (类)
@Retention : 注解的生命周期 SOURCE :源文件有效,CLASS :class文件有效, RUNTIME : 运行时有效
@Documented : javadoc记录标记
然后对应注解 自定义 method field type 三类注解
/** * 自定义注解,目标范围是字段 * * @author yanbin * */@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.FIELD)public @interface AnnotationField {public String fieldValue() default "default Field value";}/** * 自定义注解,目标范围是方法 * * @author yanbin * */@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface AnnotationMethod {public String methodValue() default "default Method value"; }/** * 自定义注解,目标是类 * * @author yanbin * */@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)public @interface AnnotationType {public String typeValue() default "default Type value";}
/** * 注解使用者 * * @author yanbin * */@AnnotationType(typeValue = "user Type value")public class AnnotationUser {/** 字段属性 */@AnnotationField(fieldValue = "user Field value")private String userField;/** * 使用者方法 */@AnnotationMethod(methodValue = "user method value")public String userMethod() {return "user default method value";}/** * 做事 */public void doIt() {System.out.println(userField);}public String getUserField() {return userField;}public void setUserField(String userField) {this.userField = userField;}}
/** * 注解测试类,获取注解关键在反射 * * @author yanbin * */public class AnnotationTest {public static void main(String[] args) {AnnotationTest test = new AnnotationTest();test.resolve();test.testDoIt();}/** * 解析如何获取注解对应注解中的值 */@SuppressWarnings({ "rawtypes", "unchecked" })public void resolve() {try {// 后去对应的类Class clazz = Class.forName("annotation.user.AnnotationUser");// 判断clazz是否存在FirstAnno.class注解if (clazz.isAnnotationPresent(AnnotationType.class)) {// 存在,则获取这个注解AnnotationType annoType = (AnnotationType) clazz.getAnnotation(AnnotationType.class);System.out.println("AnnotationType value: " + annoType.typeValue());}// 获取该类的所有方法Method[] methods = clazz.getDeclaredMethods();// 解析方法注解for (Method method : methods) {if (method.isAnnotationPresent(AnnotationMethod.class)) {AnnotationMethod annoMethod = method.getAnnotation(AnnotationMethod.class);System.out.println("AnnotationMethod value: " + annoMethod.methodValue());}}// 获取该类的所有属性字段Field[] fields = clazz.getDeclaredFields();// 解析字段注解for (Field field : fields) {if (field.isAnnotationPresent(AnnotationField.class)) {AnnotationField annoField = field.getAnnotation(AnnotationField.class);System.out.println("AnnotationField value: " + annoField.fieldValue());}}} catch (SecurityException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}/** * 解释注解中的值,并且赋值给相关属性或者方法 */public void testDoIt() {try {AnnotationUser user = new AnnotationUser();Field field = user.getClass().getDeclaredField("userField");if (field.isAnnotationPresent(AnnotationField.class)) {AnnotationField annoField = field.getAnnotation(AnnotationField.class);// getDeclaredMethod()返回一个 Method 对象,该对象反映此 Class// 对象所表示的类或接口的指定已声明方法。name 参数是一个// String,它指定所需方法的简称,parameterTypes 参数是 Class 对象的一个数组// Method doIt = user.getClass().getDeclaredMethod("doIt");// 属性必须要由set 或者get 方法,才能调用invoke方法PropertyDescriptor pd = new PropertyDescriptor(field.getName(), AnnotationUser.class);Method doIt = pd.getWriteMethod();if (null != doIt) {String value = annoField.fieldValue();doIt.invoke(user, value);}}user.doIt();} catch (Exception e) {e.printStackTrace();}}}