开发当中经常需要熟悉很多注解的含义,有时候由于业务需要可能需要进行自定义注解,可能很多人知道注解的底层是基于反射实现的,但是如果要更深入一些可能也说不出个什么所以然来,现状就是这样,于是对于这部分知识点进行梳理也是非常有必要的
元注解
元注解有四个:
- @Target (表示该注解可以用于什么地方,.TYPE:用于描述类、接口(包括注解类型) 或enum声明,.METHOD:用于描述方法,.FIELD表示域)
- @Retention(表示在什么级别保存该注解信息,用于描述注解的生命周期,SOURCE<CLASS<RUNTIME)
- @Documented(将此注解包含再javadoc中)
- @Inherited(允许子类继承父类中的注解)
内置注解
- @Override:表示当前方法覆盖了父类的方法
- @Deprecated:表示方法已经过时,方法上有横线,使用时会有警告
- @SuppressWarnings 表示关闭一些警告信息(通知java 编译器忽略特定的编译警告)
- @FunctionalInterface 表示:用来指定某个接口必须是函数式接口,否则就会编译出错
示例:
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
// 注解的参数 参数类型+参数名 (),未设置默认值使用注解时如果不加属性名就会报错
String value() default "";
// 如果参数类型是数组,用大括号表示
String[] address() default {"北京,上海"};
}
如果只有一个参数建议使用value来命名,很多注解都是这样,如RestController
注解的本质
可以通过javap反编译命令来注解到底是什么东西
- 写一个最简单的自定义注解
public @interface MyAnno {
}
- 通过javac先编译,然后通过javap 来进行反编译
通过截图内容可以看到注解的本质是一个接口(interface),该接口默认继承了java.lang.annotation.Annotation
反射(反射是动态代理的一种实现方式)
注解的底层是基于反射来实现的,反射机制指的是程序在运行时能够获取自身的信息。在 java 中,只要给定类的名字,那么就可以通过反射机制来获得类的所有属性和方法。
反射的作用
- 在运行时判断任意一个对象所属的类。
- 在运行时判断任意一个类所具有的成员变量和方法。
- 在运行时任意调用一个对象的方法。
- 在运行时构造任意一个类的对象
Class类
Java 的Class 类是java反射机制的基础,通过 Class 类我们可以获得关于一个类的相关信息。jdk中关于反射的包java.lang.reflect,Class
一个类在内存中只有一个Class对象
Class类的创建方式
1 通过对象的引用来获取、
2 通过Class.forName();
3 通过类名来进行获取
见示例:
@Test
public void add() throws ClassNotFoundException {
// 方式一:通过实例的引用来获取
User user = new User();
Class c1 = user.getClass();
System.out.println(c1.hashCode());
// 通过Class.forName()
Class c2 = Class.forName("com.example.meas.entity.User");
System.out.println(c2.hashCode());
// 通过类名来获取
Class c3 = User.class;
System.out.println(c3.hashCode());
}
打印结果:
1985363238
1985363238
1985363238
评论区