您的位置:首页 > 其它

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

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

}

 

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