java 注解开发

注解

JDK自带的注解三个

  1. @Override: 限定重写父类方法, 实现接口方法。该注解只能用于方法
  2. @Deprecated: 用于表示所修饰的元素(类, 方法,构造器等等)已过时。通常是因为所修饰的结构危险或存在更好的选择,过时是可以用的,意义只是作为一种提示,因为原来的项目中用的老的代码必须要能用,过时是给我们后面做开发的提示
  3. @SuppressWarnings: 抑制编译器警告

example
@SuppressWarnings({"unused","rawtypes"})

注解分类

按照运行机制

  1. 源码注解
    注解只在源码中存在,编译成class文件就不存在了
  2. 编译时注解
    注解在源码和class文件里都存在(jdk自带注解)
    3.运行时注解
    在运行阶段起作用。影响逻辑的注解,比如@Autowired

按照来源分类

  1. 来及JDK的注解,
  2. 来自第三方的注解
  3. 自己定义的注解

自定义注解的语法要求

1、使用@interface关键字定义注解
2、成员以无参无异方式声明
3、可以defaulit为成员指定一个默认值
4、成员的类型是受限制的,合法的类型包括原始类型,以及String,Class,Annotation,Enumeration
5、如果注解只有成员,则成员名必须取名为value(),在使用时可以忽略成员名和赋值号
6、注解类可以没有成员,没有成员的注解称为标识注解
图片名称
图片名称

元注解

  1. Retention
    决定注解的运行时机,编译时,运行时和源码注解
  2. Target
    注解的使用对象
  3. Inherited
    被使用了注解的父类,子类是否被继承
  4. Document
    是否生成文档
    图片名称
    图片名称
    图片名称
    图片名称

解析注解

概念:通过反射获取类、函数或成员上的运行时注解信息,从而实现动态控制运行的逻辑。


/**
 * 自定义注解
 */
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface AnnoTest {
    String value() default "AnnoTest";
}


/**
 * 测试类
 */
@AnnoTest("this is class")
public class Person {
    @AnnoTest("this is method")
    public void test() {

    }
}


/**
 * 解析注解
 */
public class Main {
    public static void main(String[] args) {
        try {
            //通过反射获取类
            Class c = Class.forName("anno.Son");
            //判断是否在类上包含注解
            boolean b = c.isAnnotationPresent(AnnoTest.class);
            if (b) {
                AnnoTest annotation = (AnnoTest) c.getAnnotation(AnnoTest.class);
                System.out.println(annotation.value());
            }
            //获取所有方法
            Method[] methods = c.getMethods();
            for (Method method : methods) {
                //判断在方法上是否包含注解
                boolean b1 = method.isAnnotationPresent(AnnoTest.class);
                if (b1) {
                    AnnoTest annotation = method.getAnnotation(AnnoTest.class);
                    System.out.println(annotation.value());
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
获取注解的注解

https://segmentfault.com/q/1010000018911081

Spring中的注解

组合注解

springboot中@SpringBootApplication,一个注解包括了@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan这三个注解。


@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    Class<?>[] exclude() default {};

    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    String[] excludeName() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackages"
    )
    String[] scanBasePackages() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackageClasses"
    )
    Class<?>[] scanBasePackageClasses() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "nameGenerator"
    )
    Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;

    @AliasFor(
        annotation = Configuration.class
    )
    boolean proxyBeanMethods() default true;
}
通过@AliasFor实现,@AliasFor是让字段具备父类的功能。
~~~java

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Documented
public @interface AliasFor {
    @AliasFor("attribute")
    String value() default "";

    @AliasFor("value")
    String attribute() default "";

    Class<? extends Annotation> annotation() default Annotation.class;
}
>  Class<? extends Annotation> annotation() default Annotation.class; 
这里annotation字段即是继承的class。

猜你喜欢

转载自www.cnblogs.com/lexiaoyao1995/p/13404806.html