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()); } } } }