java里面注解的简单认识

1. 什么是注解?

  注解就是元数据,对java进行标记作用、

2. 注解与xml之间的区别?

1.xml可以实现对代码的松耦合,但是后期不利于看清楚里面的逻辑关系

2.注解可以实现对代码的紧耦合,有利于看清楚逻辑关系

3. 注解的应用?

jdk自带注解
    @Override

Spring的注解
    @Service
    @Controller

自定义注解
        @interface是定义注解的标识
        @Target 主要看我们注解用在什么地方
        @Retention
            Rource  在编译器期间后失效
            Class   在类加载完成后失效
            Runtime 在运行期结束后失效
        @Docuemnt 生成java文档
        @Inherited 可以进行继承,这里的继承不是注解之间的继承,是父类使用注解,在子类可以得到父类的信息
 在注解里面定义只能是成员变量(基本类型,String,Class,Enum,annotation)

4. 从java虚拟机层面如何看待注解对元数据进行保存和传递?(HSDB可以实现对探索HotSpot VM的运行时数据)比较重要

然后代理类中创建各个AnnotationInvocationHandler对象;每个AnnotationInvocationHandler对应一个我们声明的Annotation接口类,
且AnnotationInvocationHandler收集对应注解接口类中的属性键值对。我们通过反射method.getAnnotation(**Annotation.class)或者field.getAnnotation(**Annotation.class),
底层就是调用代理类,获取AnnotationInvocationHandler中的memberValues。

5. 简单的例子

1. 定义注解类

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Interfacess {

    String desc() default "好好学习";

    String hobby() default "吃饭";

    int age() default 18;

}

2. 被使用注解的类

@Interfacess(desc="玩",hobby="打篮球",age=20)
public abstract class Persons {

    @Interfacess
    public String eat(){
        System.out.println("11111");
        return "喜欢吃拉面";
    }

    public abstract  void make();

}

3. 继承注解的类

public class Student extends Persons{

    @Override
    @Interfacess(desc="吃",hobby="骑车",age=30)
    public void make() {
        System.out.println("2222");
    }
}

4.测试类
 

public class Test{
    public static void main(String[] args) {
        Class<Student> clazz = Student.class;
        if(clazz.isAnnotationPresent(Interfacess.class)) {
            Interfacess interfacess = clazz.getAnnotation(Interfacess.class);
            System.out.println(interfacess.desc() +", "+interfacess.hobby()+", "+interfacess.age());
        }
        Method[] methods = clazz.getMethods();
        for(Method method : methods) {
            if(method.isAnnotationPresent(Interfacess.class)){
                Interfacess interfacess = method.getAnnotation(Interfacess.class);
                System.out.println(interfacess.desc() +", "+interfacess.hobby()+", "+interfacess.age());
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_41629878/article/details/84846365