自定义注解(基础篇)


前言

万丈高楼平地起 - - 基础知识。

一、Say Something — Author (SSA)

果静林09年版《袁隆平》我居然看完了(虽然存在快进的环节),前几天关于袁老的新闻报道有很多,福泽子孙后代的功绩值得每个人学习致敬。相关新闻显示袁老求学期间成绩一般,但后面持久专心的研究才取得了伟大的成就。例如马老师人到中年还一直是人民教师,后面创立阿里巴巴才闻名。任正非43岁成立华为,张忠谋56岁开办台积电。都说明天资或者求学时期只代表人生的一部分,想要在一个行业做出东西,上十年几十年的学习积累必不可少。学海无涯,离开学校才是读书学习的开始。


二、理论(Get To The Point言归正传)

1.概念

  1. 重要的作用之一,在拦截器或者AOP场景中用起起来比较优雅,在某个对象上加个注解就可以通过反射获取这个注解下的对象的相关信息,并做代理。
  2. 解析注解用到了反射,内部原理了解一二

2.元注解

JDK5.0 引入的一种注释机制,Java 定义了一套注解共有 7 个,3 个在 java.lang 中,剩下 4 个在 java.lang.annotation 中

@Target

ElementType

作用:被描述的注解可以用在什么地方
1. TYPE:用于描述类、接口(包括注解类型) 或enum声明
2. FIELD:用于描述域/属性
3. METHOD:用于描述方法

------后面几个不常用------
4. LOCAL_VARIABLE:用于描述局部变量
5. CONSTRUCTOR:用于描述构造器
6. PARAMETER:用于描述参数
7. PACKAGE:用于描述包

@Retention

RetentionPoicy

作用:被描述的注解在什么范围内有效
1. SOURCE:在源文件中有效(即源文件保留)
2. CLASS:在class文件中有效(即class保留)
3. RUNTIME:在运行时有效(即运行时保留)

@Documented
就是个标记注解,表示注解下的对象要被javadoc此类的工具文档化

下面是其他注解

@Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)
从 Java 7 开始,额外添加了 3 个注解:
@SafeVarargs - Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
@FunctionalInterface - Java 8 开始支持,标识一个匿名函数或函数式接口。
@Repeatable - Java 8 开始支持,标识某注解可以在同一个声明上使用多次。


3.反射

说到注解就不得不提反射,反射获取到注解标注的对象来操作。

  • 下面是new一个对象创建实例的过程图

在这里插入图片描述

  • 与上面的new创建对象相比,反射是通过类的class对象反向获取它的方法/注解/构造器等 的信息,当然也包括获取这个对象的实例,但是效率上new对象获取实例的效率较高,反射需要查找类资源,使用类加载器创建。反射的优点是可以动态的获取实例交灵活。
  • java的lang包下Class类的相关Api就不说了有兴趣打开JDK查阅。

4.Example

下面是笔者示例的测试类。

在这里插入图片描述

这里重点看下笔者的测试类:

@Slf4j(topic = "dev")
public class TestAnno {

	public static void main(String[] args) {
		Class<Oganda> ogandaClass = Oganda.class;
		if (ogandaClass.isAnnotationPresent(Toy.class)) {
			Toy annotation = ogandaClass.getAnnotation(Toy.class);
			String name = annotation.name();
			log.info("This name is {}",name);
		}
		try {
			Method method = ogandaClass.getMethod("effect");
			String name = method.getName();
			log.info("this is function {}",name);
			/*通过构造方法获取这个对象的实例*/
			Oganda oganda = ogandaClass.getDeclaredConstructor().newInstance();
			/*执行effect方法*/
			method.invoke(oganda);
		} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException | InstantiationException e) {
			e.printStackTrace();
		}

	}
}

这里可以看的打印了预期的数据。
在这里插入图片描述


总结

基础知识

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值