Java注解

注解本质是一个接口,功能是对程序的描述(给计算机看的)

作用

  1. 编写文档
  2. 代码分析
  3. 编译检查
  4. 可替换配置文件的工作

内置注解

  1. @Override:检测继承
  2. @Deprecated:标注过时
  3. @SuppressWarnings(“all”):压制所有警告

元注解:

@Target:指定被描述注解的作用位置(类TYPE,成员变量FIELD,方法METHOD)

@Retention:指定被描述注解的保留阶段(源码,class,runtime)

@Document:被描述注解是否抽取到API文档中

@Inherited:被描述注解是否会被子类继承

定义方式:

  1. 元注解:描述注解的注解

  2. public @interface 接口名,@interface等价于extend Annotation接口

  3. 属性:接口中的抽象方法,返回值:基本数据类型,String,枚举,注解及以上类型的数组

  4. 属性定义的特殊情况:

    • default:String name() default “小明”;可以赋默认值
    • value:int value();当只有一个值时可以省略value

代码示例:

自定义注解

public @interface SelfAnno {

    int value();
    String name() default "小明";
    int[] age();
}

测试类

public class Demo {
    
    @SelfAnno(value = 13,age={12,456,1})
    public void test(){
    }
}

参数如下

自定义注解参数

注解替换配置文件案例:

Demo类1

package main.java.com.guaosky.annotationtest;

public class ProDemo {

    public void show(){
        System.out.println("ProDemo running~");
    }
}

Demo类2

package main.java.com.guaosky.annotationtest;

public class ProDemo1 {

    public void show(){
        System.out.println("ProDemo1 start!");
    }
}

注解类

package main.java.com.guaosky.annotationtest;


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ProSetting {

    String className();
    String methodName();
}

测试类

package main.java.com.guaosky.annotationtest;

import java.lang.reflect.Method;

@ProSetting(className = "main.java.com.guaosky.annotationtest.ProDemo1",methodName = "show")
public class ProMain {

    public static void main(String[] args) throws Exception{

        Class<ProMain> cls = ProMain.class;
        ProSetting proSettingImpl = cls.getAnnotation(ProSetting.class);
        String className = proSettingImpl.className();
        String methodName = proSettingImpl.methodName();
        

        // 根据类名获取字节码文件对象
        Class aClass = Class.forName(className);
        Object obj = aClass.newInstance();
        Method method = aClass.getMethod(methodName);
        method.invoke(obj);
    }
}

结果

ProDemo1 start!
posted @ 2020-03-28 15:31  guaosky  阅读(144)  评论(0)    收藏  举报