Java 注解(annotation)

一、摘要

        java注解(annotation)是附加在代码中的一些元信息,简单说就是标记和注释,用于在编译、运行等时刻进行某些检查等操作,起到说明、配置、标记等功能,注解不会也不能影响代码的实际逻辑,仅仅起到辅助性作用,不过程序员可以利用这些标记做出某些操作。

二、示例代码

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
public @interface Man {
    String manName();
    int manAge() default 20;
}
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AgeAdder {
    int addValue();
}
@Man(manName = "Teacher Wang", manAge = 100)
public class Teacher {
private String name;
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
@AgeAdder(addValue = 10)
public void doAddAge(int age) {
    System.out.println("增加年龄: = " + age);
}
}

测试:

import javax.annotation.Resource;
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class AnnotationTest {
    public static void main(String[] args) throws Exception {
        Class<?> clazz = Teacher.class;
        Teacher teacher = (Teacher) clazz.newInstance();
        String name = "";
        if (clazz.isAnnotationPresent(Man.class)) {
            Man man = clazz.getAnnotation(Man.class);
            name = man.manName();
            int age = man.manAge();
            System.out.println("被标记为男性教师!");
            System.out.println("name = " + name);
            System.out.println("age = " + age);
        }
        Method[] methods = clazz.getDeclaredMethods();
        for (int i = 0; i < methods.length; i++) {
            if (methods[i].getName().equals("setName")) {
                methods[i].invoke(teacher, name);
            }
            Method method = methods[i];
            if (method.isAnnotationPresent(AgeAdder.class)) {
                AgeAdder ageAdder = method.getAnnotation(AgeAdder.class);
                int addValue = ageAdder.addValue();
                System.out.println("有增加年龄的方法标记:  名称->" + method.getName() + "增加幅度->" + addValue);
            }
        }
        System.out.println("从注解中获取的名字 = " + teacher.getName());
    }
}


运行结果:

被标记为男性教师!
name = Teacher Wang
age = 100
有增加年龄的方法标记:  名称->doAddAge 增加幅度->10
从注解中获取的名字 = Teacher Wang

注解起标记作用,如Servlet3.0标准、EJB3.0、 Spring等都支持注解,它们都在类初始化的时候进行特定的注解检查,进而完成特定的业务操作,具体注解检查的工作可以按上文所示使用java的api进行,也可以使用第三方的工具如ASM等进行,OpenEJB、Spring等都使用ASM。

注解的检查时机一般在类加载的时刻,JDK1.5以后的instrument机制(设置javaagent)及1.6以后的探针技术更加方便了注解的检查工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值