Java使用注解和动态代理实现方法调用时的日志记录示例
来源:互联网 发布:什么叫网络建设与管理 编辑:程序博客网 时间:2024/06/05 22:46
1.定义一个注解:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogTag {
String level() default "info";
}
2.定义一个接口
public interface ITest {
void excuteBusiness();
}
3.定义一个代理类
/**
* 代理类
* @author chenshuai
* @version 1.0
*
*/
public class ProxyBean implements InvocationHandler {
private Object o;
/**
* @return the o
*/
private Object getO() {
return o;
}
/**
* @param o the o to set
*/
private void setO(Object o) {
this.o = o;
}
/**
* 创建代理
* @param obj
* @return
*/
public static <T> T createProxy(T obj) {
ProxyBean tem = new ProxyBean();
tem.setO(obj);
return (T) Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), tem);
}
/*
* (non-Javadoc)
*
* @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object,
* java.lang.reflect.Method, java.lang.Object[])
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//从实际的类对象中查找到所调用的具体方法,用来检测实际类的方法上的注解
//否则需要把注解加载接口的方法上
Method[] methods = o.getClass().getMethods();
List<Class<?>> types = new ArrayList<Class<?>>();
Method mm = null;
//通过反射查找方法
if (args == null || args.length == 0) {
mm = o.getClass().getMethod(method.getName(), null);
} else {
for (Object oo : args) {
types.add(oo.getClass());
}
mm = o.getClass().getMethod(method.getName(), (Class<?>[]) types.toArray());
}
System.out.println("代理启动");
//检查注解类型
Annotation[] annos = mm.getAnnotations();
for (Annotation anno : annos) {
if (anno instanceof LogTag) {
LogTag tem = (LogTag) anno;
System.out.println("探测到了LogTag注解,并且发现注解的level值为:" + tem.level());
}
}
//调用具体的方法,执行业务逻辑
method.invoke(o, args);
System.out.println("代理结束");
return null;
}
}
4.定义一个入口测试类
public class TestBean implements ITest {
@LogTag(level = "warn")
public void excuteBusiness() {
System.out.println("启动业务处理");
}
public static void main(String[] args) {
ITest a = new TestBean();
ITest proxy = ProxyBean.createProxy(a);
proxy.excuteBusiness();
}
}
运行结果
知识点:
1.Java动态代理:需要注意的是Java的动态代理要求被代理类必须继承自接口。
2.注解:注意@Retention和@Target两个注解的使用方法。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogTag {
String level() default "info";
}
2.定义一个接口
public interface ITest {
void excuteBusiness();
}
3.定义一个代理类
/**
* 代理类
* @author chenshuai
* @version 1.0
*
*/
public class ProxyBean implements InvocationHandler {
private Object o;
/**
* @return the o
*/
private Object getO() {
return o;
}
/**
* @param o the o to set
*/
private void setO(Object o) {
this.o = o;
}
/**
* 创建代理
* @param obj
* @return
*/
public static <T> T createProxy(T obj) {
ProxyBean tem = new ProxyBean();
tem.setO(obj);
return (T) Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), tem);
}
/*
* (non-Javadoc)
*
* @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object,
* java.lang.reflect.Method, java.lang.Object[])
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//从实际的类对象中查找到所调用的具体方法,用来检测实际类的方法上的注解
//否则需要把注解加载接口的方法上
Method[] methods = o.getClass().getMethods();
List<Class<?>> types = new ArrayList<Class<?>>();
Method mm = null;
//通过反射查找方法
if (args == null || args.length == 0) {
mm = o.getClass().getMethod(method.getName(), null);
} else {
for (Object oo : args) {
types.add(oo.getClass());
}
mm = o.getClass().getMethod(method.getName(), (Class<?>[]) types.toArray());
}
System.out.println("代理启动");
//检查注解类型
Annotation[] annos = mm.getAnnotations();
for (Annotation anno : annos) {
if (anno instanceof LogTag) {
LogTag tem = (LogTag) anno;
System.out.println("探测到了LogTag注解,并且发现注解的level值为:" + tem.level());
}
}
//调用具体的方法,执行业务逻辑
method.invoke(o, args);
System.out.println("代理结束");
return null;
}
}
4.定义一个入口测试类
public class TestBean implements ITest {
@LogTag(level = "warn")
public void excuteBusiness() {
System.out.println("启动业务处理");
}
public static void main(String[] args) {
ITest a = new TestBean();
ITest proxy = ProxyBean.createProxy(a);
proxy.excuteBusiness();
}
}
运行结果
知识点:
1.Java动态代理:需要注意的是Java的动态代理要求被代理类必须继承自接口。
2.注解:注意@Retention和@Target两个注解的使用方法。
阅读全文
0 0
- Java使用注解和动态代理实现方法调用时的日志记录示例
- java动态代理详解,并用动态代理和注解实现日志记录功能
- java 动态代理aop 实现日志记录
- java使用动态代理来实现AOP(日志记录)的实例代码
- 动态代理实现日志记录
- Java注解的部分实现:动态代理
- java动态代理对象实现日志的拦截(annotation自定义注解方式)
- CGLIB动态代理应用-java使用记录操作日志
- JAVAWEB开发之Servlet3.0新特性的使用以及注解的详细使用和自定义注解的方法、动态代理的使用、利用动态代理实现细粒度的权限控制以及类加载和泛型反射
- Java注解 和动态代理
- Jersey使用注解和过滤器实现日志记录
- 动态代理记录日志
- 自定义注解和aop结合使用---自定义日志记录的实现
- 基于注解的Java动态代理技术实现
- Java动态代理的实现方法
- Java自定义注解 和 springMVC拦截器 配合使用记录系统操作日志的案例
- Java中有关注解和动态代理的知识
- JAVA动态代理和方法拦截(使用CGLib实现AOP、方法拦截、委托)
- POJ-3624 Charm Bracelet (01背包 入门题)
- Spring框架之IoC容器—BeanFactory接口
- python enumerate用法总结
- Python3爬取网页数据存入MySQL
- Dubbo服务只订阅和只注册
- Java使用注解和动态代理实现方法调用时的日志记录示例
- Linux下串口调试及使用shell编程接收数据
- 100亿数据1万属性数据架构设计
- 条件查询
- NodeInstaller
- Maven详解
- 晶体管 放大电路的 分析
- mvc,mvp,mvvm图示详解
- UDP转TCP隧道工具udptunnel