使用反射机制获取注解信息
2019-05-26 13:35
417 查看
[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; @Target(value = ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) // @interface 定义注解 public @interface AddAnnotation { // 手写Spring事务注解 int userId() default 0; String userName() default "默认名称"; String[]arrays(); }
[code]package com.learn.annotation; import java.lang.reflect.Method; //@AddAnnotation public class User { @AddAnnotation(userName = "张三", userId = 18, arrays = { "1" }) public void add() { } /** * 我在这边再来个del方法 * * */ public void del() { } /** * 注解定义好了之后 * 会有好多问题 * * * @param args * @throws ClassNotFoundException */ public static void main(String[] args) throws ClassNotFoundException { // 怎么样获取到方法上注解信息 反射机制 /** * 我们怎么样获取注解的信息 * 获取方法上的注解信息 * 怎么获取呢 * 比如我怎么获取add方法上的注解信息呢 * 谁能告诉我 * 反射机制 * 这个该怎么用呢 * Class.forName我们反射一下我们的User类 * 我们可以拿到Class对象 * 拿到Class对象之后呢 * * */ Class<?> forName = Class.forName("com.learn.annotation.User"); // 获取到当前类(不包含继承)所有的方法 /** * 我们可以调用getDeclaredMethods这个方法 * 调用这个方法 * 我可以告诉你们 * 他就可以怎么样呢 * 你们可以这样做 * 跟你们说一下 * 这样可能就更加简单一点 * 获取所有方法的注解 * getDeclaredMethods这个方法干嘛用的呢 * 获取当前类记住不包含继承 * 当前类所有的方法 * 这一步写完了之后 * 你就可以直接拿到这个返回结果 * 去循环一下 * * */ Method[] declaredMethods = forName.getDeclaredMethods(); /** * 循环完了之后 * 然后在这边你怎么做呢 * * 我们如果要手写事务注解的情况下 * 也可以 * 你们要知道 * 知道为什么要这么做呢 * 你们想想 * * main函数有一个 * 然后再是add方法 * 然后再是del方法 * 是不是这样的 * 你如果要获取构造函数是另一个方法 * 那这段代码你懂不懂什么意思没有 * 只要这段代码能懂的情况下 * 待会你们讲手写事务的时候 * 也能够搞懂的 * 比较简单 * 我觉得一点都不难 * 其实我是怎么觉得呢 * 这个完全跟你的思维能力有关系的 * 这个不难的 * * * */ for (Method method : declaredMethods) { // 获取该方法上是否存在注解 /** * 这里是方法名称 */ System.out.println("####方法名称" + method.getName()); /** * 你就可以获取这个方法上面是否有注解 * 获取该方法上是否存在这个注解 * 然后怎么写呢 * 我们就写AddAnnotation.class就OK了 * 我们是不是就拿到这个注解对象AddAnnotation * 拿到之后 * 这段代码比较重要 * 你们一定要学号 * 你们知道事务注解是怎么实现出来的 * 就是做铺垫的 * * 我就是通过这段代码去判断一下 * 判断方法上面有没有加上这个注解 * 如果有这样的注解的情况下 * 我就去加上事务 * 有这个注解的情况下我就去提交事务 * 有这样的注解情况下我就去回滚事务 * 所以这段代码待会还会用到的 * 就这样的一个思想 * 你们这边要学会这个思想 * * */ AddAnnotation addAnnotation = method.getDeclaredAnnotation(AddAnnotation.class); /** * 然后我这边把它判断一下 * addAnnotation他为null的情况下 * 他就没有这样的注解 * 该方法上没有注解 * 这个时候你们一定要回顾一下 * 原来这上面的main也是方法 * main也是方法看到没有 * 总共有3个方法 * 这个main看到没有 * 然后再是add方法 * 然后再是del方法 * 看到没有 * * */ if (addAnnotation == null) { // 该方法上没有注解 /** * 他肯定会走到这里面 * 该方法上没有加这个注解 * * */ System.out.println("该方法上没有加注解.."); /** * 在这里用continue还是用break好啊 * 你们说一下 * 这个你们想一下 * 不要忘记了好吧 * 还是用return好 * 这三个都是用做结束的 * 肯定是有区别的 * 在这里告诉你们 * 用continue * 记住不要去用break * 因为待会还要继续循环的 * 然后这边写完了之后呢 * 然后我再继续 * 代码走到这里的情况下 * * */ continue; } /** * 在该方法上查找到该注解 * 是不是这样的 * 然后这个时候怎么做呢 * addAnnotation.userId是不是这样的 * 然后再addAnnotation.userName * 然后还有参数叫addAnnotation.arrays * 你可以直接打印一下 * 我就直接打印一下 * 这个代码你们待会还会用到的 * * userId:18 * userId是为几你们看一下 * 是不是为18 * * */ System.out.println("userId:" + addAnnotation.userId()); /** * 叫userName是不是这样的 * userName:张三 * 然后userName是为张三 * * */ System.out.println("userName:" + addAnnotation.userName()); /** * 这个写完了之后就OK了 * arrays:[Ljava.lang.String;@677327b6 * */ System.out.println("arrays:" + addAnnotation.arrays()); /** * 这里换行一下 * */ System.out.println(); } } }
[code]package com.learn.service; //user 服务层 public interface UserService { public void add(); public void del(); }
[code]package com.learn.service.impl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.learn.dao.UserDao; import com.learn.service.UserService; import com.learn.transaction.TransactionUtils; /** * 这就是编程式事务 * * @author Leon.Sun * */ @Service public class UserServiceImpl implements UserService { @Autowired private TransactionUtils transactionUtils; @Autowired private UserDao userDao; /** * 这里加了一个事务注解 * 就开始事务 * * */ @Transactional public void add() { try { userDao.add("test001", 20); int i = 1/0; System.out.println("####################################"); userDao.add("test002", 21); } catch (Exception e) { e.printStackTrace(); } } /** * 这里没有加注解就不开启事务 * 那么最后怎么做呢 * * * * */ public void del() { System.out.println("del"); } }
相关文章推荐
- C#使用反射机制获取类信息_百度文库
- C#使用反射机制获取类信息
- C#使用反射机制获取类信息
- C#使用反射机制获取类信息
- 【反射】使用反射来获取注解原数据信息-类信息-方法信息等
- C#使用反射机制获取类信息
- C#使用反射机制获取类信息[转]
- 使用反射获取注解的信息
- C#使用反射机制获取类信息
- 使用反射机制获取 蓝牙BluetoothDevice API
- java 注解annotation的使用,以及反射如何获取注解
- c#反射机制学习和利用反射获取类型信息
- 运用反射获取自定义注解信息
- c#反射机制学习和利用反射获取类型信息
- php反射机制获取未知类的详细信息
- 利用反射机制来获取表单请求值以及对象赋值(使用了第三方插件)
- Java 之路 (十四) -- 类型信息(RTTI、Class 对象的加载、Class 引用的获取与泛化、instanceof 关键字、反射基础与简单使用示例)
- 黑马程序员自学笔记————通过反射来获取注解的信息;
- Java使用反射来获取Map的泛型信息
- C#中使用typeof关键字和GetType()获取类的内部结构(反射机制)