您的位置:首页 > 其它

自定义注解使用

2019-05-26 12:55 447 查看
[code]我们怎么去定义一个自己的一个注解,我们怎么定义呢,这就跟你讲一下,我们讲一下我们自己手写一个注解,实现类似于Spring里的

注解功能,那这个我们怎么办呢,自定义注解比较简单,你们之前可能也都用过了,在这里我就做一个自定义注解,去获取到注解上

的一些信息,给大家演示一下,定义注解的话谁有印象,有没有人之前搞过的,你们下去有兴趣的可以看一下,他的源码里面写了,

你们可以看一下,@Transactional,他源码里面是不是也是这样写的,专门定义一个包写注解的,具体实现我们待会再说,接着我们

来写一下,定义一下这个注解
[code]package com.learn.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* 我们定义一个注解
* 我们通过@interface这个关键字
* 可以去定义注解了
* 那这就是我们的注解了
* 看到没有
* 那我们怎么去用这个注解
* 给你们说一下
* 我们这样用
* 我们去看一下
* 这里我们定义了一个add注解
* 通过@interface这个关键字定义起来
* 我可以把注解加上去的
* 这个注解有几个特性说一下
* 你可以设置这个注解在哪些权限上用到
* @Target里面就可以去引用一下
* 表示这个注解可以在哪些地方用到
* 他的约束
* 他只能在METHOD
* 在方法上进行使用
* 那么这个时候我给你讲一下
* 这个时候你会发现你的注解只能在方法上定义了
* 不能够在类上进行定义了
* 你可以看一下里面的类型ElementType
* 他还有很多类型
* 这个作用干嘛用的呢
* 记住@Target这个注解作用是干嘛用
* 设置你注解的权限
* 还少一个
* 咱们再加一个权限
* 你们也可以写成数组形式
* ElementType.Type
* 这个时候你就不能在方法上进行使用了
* 你们可以看一下
* 只能在类上进行使用了
* 在这里有很多权限
* 具体怎么约束呢
* 你们下去看看有很多参数
* 就是Target里面有很多参数
* 我就不去讲了
* 因为这个都比较简单
* 你们自己下去看一下文档
* 去实验就行了
* 这里面还有一个标识
* 就是@Retention这个注解
* 目的是干嘛用的呢
* 你们在上面还要讲一个注解
* 加@Retention这样的一个注解
* 表示整个描述的一个生命周期
* 我们在运行的时候可以用到这样的一个注解的
* 那么怎么用呢
* 用的话也是比较容易的
* RetentionPolicy.RUNTIME
* 你用到这样的时候
* 项目运行的时候
* 你就可以用到注解里面的功能了
* 然后给你们讲一下
* 我们不是要手写Spring的事务注解吗
* 记住啊
* 这段代码一定要加
* 反射想要获得注解的情况下
* 这段代码是必须要加的
* 要不然以为他反射没有用到这个注解
* 项目运行的时候
* 就相当于运行的时候调用这个注解的
* 所以这个注解最好是设置一下
* 那么这个定义好了之后
* ElementType.METHOD
* 我们让他在方法上进行使用
*
*
* @author Leon.Sun
*
*/
@Target(value = ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
// @interface 定义注解
public @interface AddAnnotation {

// 手写Spring事务注解
/**
* 我们在这里写一个方法
* int类型的userId()
* 默认值多少呢
* 默认为0
* 是不是这样的
*
*
* @return
*/
int userId() default 0;

/**
* 我们还可以继续写
* String类型的userName()
* 然后我们default默认名称
*
*
* @return
*/
String userName() default "默认名称";

/**
* 我们再写一个定义数组
* 你们也可以给一个初始化
* 这个看你们自己
* 写一个方法
* 整个就写完了
* 这里我们定义三个方法之后
*
*
* @return
*/
String[]arrays();
}
[code]package com.learn.annotation;

import java.lang.reflect.Method;

/**
* 在类上定义就直接报错了
* 看到效果没有
*
*
* @author Leon.Sun
*
*/
//@AddAnnotation
public class User {

/**
* 你们看一下@AddAnnotation这个注解是直接可以用的
* 看到没有
* 这个比较简单
* 这里加了几个参数
* userName我们就叫做张三
* 然后再写userId等于18
* 我们就可以设置18岁
* 我们再来一个参数叫做数组arrays
* 我就可以写一个值
* 叫做1
* 那么这个写完了之后
* 这个定义注解难不难
* 不难吧应该
* 这个都是属于JAVASE的知识
* 不是很难
* 那么这个写完了之后
* 我就给你们讲一下
* 通过反射机制获取注解参数
* 这都是固定格式
* 只要定义多了就OK了
*
*
*/
@AddAnnotation(userName = "张三", userId = 18, arrays = { "1" })
public void add() {

}

public void del() {

}

public static void main(String[] args) throws ClassNotFoundException {
// 怎么样获取到方法上注解信息 反射机制
Class<?> forName = Class.forName("com.learn.annotation.User");
// 获取到当前类(不包含继承)所有的方法
Method[] declaredMethods = forName.getDeclaredMethods();
for (Method method : declaredMethods) {
// 获取该方法上是否存在注解
System.out.println("####方法名称" + method.getName());
AddAnnotation addAnnotation = method.getDeclaredAnnotation(AddAnnotation.class);
if (addAnnotation == null) {
// 该方法上没有注解
System.out.println("该方法上没有加注解..");
continue;
}
// 在该方法上查找到该注解
System.out.println("userId:" + addAnnotation.userId());
System.out.println("userName:" + addAnnotation.userName());
System.out.println("arrays:" + addAnnotation.arrays());
System.out.println();
}
}

}
[code]实现自定义注解
元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它
annotation类型作说明。Java5.0定义的元注解:
@Target
@Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、
类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的
声明中使用了target可更加明晰其修饰的目标。
1.	CONSTRUCTOR:用于描述构造器
2.	FIELD:用于描述域
3.	LOCAL_VARIABLE:用于描述局部变量
4.	METHOD:用于描述方法
5.	PACKAGE:用于描述包
6.	PARAMETER:用于描述参数
7.	TYPE:用于描述类、接口(包括注解类型) 或enum声明

2.@Retention
表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
3.@Documented
4.@Inherited

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: