使用反射机制获取注解信息

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();
}
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();
		}
	}

}
package com.learn.service;

//user 服务层
public interface UserService {

	public void add();
	
	public void del();

}
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");
	}
	
	
}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值