自定义注解使用
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
相关文章推荐
- Java中自定义注解介绍与使用场景详解
- shiro自定义realm无法使用注解
- JAVAWEB开发之Servlet3.0新特性的使用以及注解的详细使用和自定义注解的方法、动态代理的使用、利用动态代理实现细粒度的权限控制以及类加载和泛型反射
- 使用自定义注解来验证属性是否规范
- springmvc 下使用自定义注解获取登录信息
- SpringBoot系列之使用自定义注解校验用户是否登录
- Hibernate使用自定义脚本替换注解或者xml文件中的自动生成表结构
- JAVA常用自定义的注解使用
- Java自定义注解及使用
- 注解及自定义注解的使用
- spring 自定义注解及使用
- 关于使用MyBatis-Generator时自定义注解生成器的一些问题
- 利用spring 自定义注解扫描 找出使用自定义注解的类
- @自定义注解的使用
- mybatis对java自定义注解的使用——入门篇
- java自定义注解及注解使用
- 使用springmvc拦截器+自定义注解做权限管理
- Spring中使用自定义的注解校验器的实现
- 使用自定义注解生成简单查询sql语句
- Java自定义注解(Annotation)的使用