目 录CONTENT

文章目录

注解

在水一方
2022-01-29 / 0 评论 / 0 点赞 / 472 阅读 / 1,641 字 / 正在检测是否收录...

开发当中经常需要熟悉很多注解的含义,有时候由于业务需要可能需要进行自定义注解,可能很多人知道注解的底层是基于反射实现的,但是如果要更深入一些可能也说不出个什么所以然来,现状就是这样,于是对于这部分知识点进行梳理也是非常有必要的

元注解

元注解有四个:

  • @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 来进行反编译
    image.png

通过截图内容可以看到注解的本质是一个接口(interface),该接口默认继承了java.lang.annotation.Annotation

反射(反射是动态代理的一种实现方式)

注解的底层是基于反射来实现的,反射机制指的是程序在运行时能够获取自身的信息。在 java 中,只要给定类的名字,那么就可以通过反射机制来获得类的所有属性和方法。

反射的作用

  • 在运行时判断任意一个对象所属的类。
  • 在运行时判断任意一个类所具有的成员变量和方法。
  • 在运行时任意调用一个对象的方法。
  • 在运行时构造任意一个类的对象

Class类

Java 的Class 类是java反射机制的基础,通过 Class 类我们可以获得关于一个类的相关信息。jdk中关于反射的包java.lang.reflect,Class这个类是java.lang包下的一个类。

一个类在内存中只有一个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

0

评论区