java 注解

/**
 * 注解:
 * 是一个代码级别的说明,与类和接口平级关系
 * JDK中提供的常用注解:
 * @Override:描述方法的重写
 * @SuppressWarnings:压制\忽略警告
 * @Deprecated:标记已过时
 */
public class Test {
    /**
     * 注解:
     * 是一个代码级别的说明,与类和接口平级关系
     * JDK中提供的常用注解:
     * @Override:描述方法的重写
     * @SuppressWarnings:压制\忽略警告
     * @Deprecated:标记已过时
     */
    public static void main(String[] args) {
        //加上这个注解,忽略黄色的警告
        @SuppressWarnings("all")
        int i;
        Test test = new Test();
        test.method();
    }
    //标记该方法已过时
    @Deprecated
    public void method(){

    }
}

class Fu{
    void method1(){};
}
class zi extends Fu{
    @Override
    void method1() {
        super.method1();
    }
}

自定义注解:

 //定义属性
    //属性格式:数据类型 属性名();
    /**
     * 数据类型只能是一下几种类型:
     * 1,基本类型
     * 2,String
     * 3,Class类型
     * 4,注解类型
     * 5,枚举类型
     * 6,以上类型的一维数组类型
     */

public @interface MyAnnotation {
    //定义属性
    //属性格式:数据类型 属性名();
    /**
     * 数据类型只能是一下几种类型:
     * 1,基本类型
     * 2,String
     * 3,Class类型
     * 4,注解类型
     * 5,枚举类型
     * 6,以上类型的一维数组类型
     */
    int i();
    String name();
    boolean b();

    Class cls();
    
}

 使用注解

public class Test2 {
    /**
     * 使用注解:
     *      1,没有属性的注解
     *      2,有属性的注解
     *      给有属性的注解赋值
     *      @注解名(属性名=属性值,属性名=属性值...)
     */
    public static void main(String[] args) {

    }
    @NAnnotation
    public void method1(){

    }
    @YAnnotation(name = "张三")
    public void method2(){

    }
}
/**
 * 使用注解注意事项:
 * 1,一旦注解有属性了,使用注解的时候,属性必须赋值
 * 2,若属性类型是一位数组时,当数组值只有一个时,可以省略{}
 * 3,如果注解中只有一个属性,并且属性名为value,那么给注解属性赋值的时候,注销属性名value可以省略
 * 4,注解属性可以用默认值,格式:属性类型 属性名() defalt 默认值
 */

元注解

/**
 * 元注解:定义在注解上的注解
 * @Target 表示注解作用在什么上面,默认注解可以放在任何位置
 * ElementType.METHOD 可以作用在方法上
 * ElementType.TYPE 可以作用在接口上
 * ElementType.FIELD 可以作用在成员变量上
 * ElementType.CONSTRUCTOR 可以作用构造方法上
 *
 * @Retention
 * 定义该注解默认保留在哪个阶段,默认只在源码阶段保留
 *
 * .java文件(SOURCE)-》javac编译-》.class文件(编译阶段,字节码阶段,CLASS)-》运行阶段(RUNTIME)
 */

注解解析

java.lang.reflect

Interface AnnotatedElement

AnnotatedElement已知实现类如下,所以如果我们的注解如果是加到类上,就通过反射来获取到类,如果注解加到字段上就通过反射获取类的成员变量,如果注解加的方法上就通过反射获取方法。。。。。。

 

案例

public class Test {
    /**
     * java.lang.reflect
     * AnnotatedElement接口
     *
     * T	getAnnotation(Class<T> annotationClass)
     * 返回该元素的,如果这样的注释 ,否则返回null指定类型的注释。参数,传入注解的class对象
     *
     *  default boolean	isAnnotationPresent(Class<? extends Annotation> annotationClass)
     *  如果此元素上 存在指定类型的注释,则返回true,否则返回false。
     */
    public static void main(String[] args) throws NoSuchMethodException {
        //通过反射获取到method1方法
        Class<Test> testClass = Test.class;
        Method method1 = testClass.getDeclaredMethod("method1");
        method1.setAccessible(true);
        //传入注解的class对象
        MyAnnotation annotation = method1.getAnnotation(MyAnnotation.class);
        //获取到注解属性的值
        String name = annotation.name();
        int age = annotation.age();
        //然后根据值执行注解的方法
        if("张三".equals(name)){
            System.out.println("如果name属性值是张三,那么执行某某方法");
        }
        if(age==18){
            System.out.println("如果age属性值是张三,那么执行某某方法");
        }
    }
    @MyAnnotation(name = "李四",age = 18)
    public static void method1(){
        System.out.println("执行method1");
    }

    public static void method2(){

    }
}
@Target(ElementType.METHOD)
//保留到运行阶段
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String name() default "张三";
    int age();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值