java注解处理
package com.yc.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 给方法添加日志处理
* @author jp
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyLog {
Class<?> value();
}
package com.yc.annotation;
/**
* 计算器业务处理接口
* @author jp
*
*/
public interface Calculator {
int add(int num01, int num02);//加法操作
int divid(int num01, int num02);//除法操作
}
package com.yc.annotation.impl;
import com.yc.annotation.Calculator;
import com.yc.annotation.MyLog;
/**
* 计算器业务处理实现类
* @author jp
*
*/
public class CalculatorImpl implements Calculator {
@MyLog(CalculatorLogging.class)
public int add(int num01, int num02) {
int result = num01 + num02;
System.out.println(num01 + " + " + num02 + " = " + result);
return result;
}
public int divid(int num01, int num02) {
int result = num01 / num02;
System.out.println(num01 + " / " + num02 + " = " + result);
return result;
}
}
3.日志处理
package com.yc.annotation;
/**
* 日志处理接口
* @author jp
*/
public interface ILogging {
public void beginMethod(String methodName, Object...params); //前置处理日志
public void afterMethod(String methodName, Object result);//后置处理日志
}
package com.yc.annotation.impl;
import java.util.Arrays;
import com.yc.annotation.ILogging;
/**
* 日志处理实现类
* @author jp
*/
public class CalculatorLogging implements ILogging{
public void beginMethod(String methodName, Object...params){
System.out.println(methodName + "开始计算,计算数据是:" + Arrays.toString(params));
}
public void afterMethod(String methodName, Object result){
System.out.println(methodName + "计算完成,计算结果是:" + result);
}
}
4.代理注解解析处理类
package com.yc.annotation.impl;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import com.yc.annotation.Calculator;
import com.yc.annotation.ILogging;
import com.yc.annotation.MyLog;
/**
* 计算器处理的动态代理对象
* @author jp
*/
public class ProxyCalculator {
/**
* @param c 具体要执行处理的实现类的接口类型
* @return 代理对象
*/
public Calculator getInstance(final Calculator c) {
ClassLoader loader = c.getClass().getClassLoader();
Class<?>[] interfaces = c.getClass().getInterfaces();
InvocationHandler h = new InvocationHandler() {
/* 代理对象回调处理函数
* proxy代理对象
* method代理执行的方法
* args执行方法的参数
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Method m = c.getClass().getMethod(method.getName(), method.getParameterTypes()); //取到具体执行的方法类对象
Object result = null;
if (m.isAnnotationPresent(MyLog.class)) { //判断方法是否被注解
MyLog ml = m.getAnnotation(MyLog.class); //取到注解对象
ILogging cl = (ILogging) ml.value().newInstance(); //取到注解对象的参数值
cl.beginMethod(method.getName(), args); //前置处理日志
result = method.invoke(c, args);//执行方法
cl.afterMethod(method.getName(), result);//后轩算是日志
} else {
result = method.invoke(c, args); //执行方法
}
return result;
}
};
return (Calculator) Proxy.newProxyInstance(loader, interfaces, h); //创建代理对象
}
}
5.测试处理结果
package com.yc.annotation;
import static org.junit.Assert.*;
import org.junit.Test;
import com.yc.annotation.impl.CalculatorImpl;
import com.yc.annotation.impl.ProxyCalculator;
public class CalculatorTest {
@Test
public void testMethodAnnot() throws InstantiationException, IllegalAccessException {
Calculator c = new ProxyCalculator().getInstance(new CalculatorImpl());
int result = c.add(12, 23); //加了日志注解的测试
assertEquals(35, result);
System.out.println("=========================");
c.divid(4, 2); //没有加日志注解的测试
assertEquals(2, result);
}
}
结果:
4 / 2 = 2
java注解处理的更多相关文章
- Java注解
Java注解其实是代码里的特殊标记,使用其他工具可以对其进行处理.注解是一种元数据,起到了描述.配置的作用,生成文档,所有的注解都隐式地扩展自java.lang.annotation.Annotati ...
- 19.Java 注解
19.Java注解 1.Java内置注解----注解代码 @Deprecated //不推荐使用的过时方法 @Deprecated ...
- Java注解入门
注解的分类 按运行机制分: 源码注解:只在源码中存在,编译后不存在 编译时注解:源码和编译后的class文件都存在(如@Override,@Deprecated,@SuppressWarnin ...
- java注解(Annotation)解析
注解(Annotation)在java中应用非常广泛.它既能帮助我们在编码中减少错误,(比如最常见的Override注解),还可以帮助我们减少各种xml文件的配置,比如定义AOP切面用@AspectJ ...
- JAVA 注解的几大作用及使用方法详解
JAVA 注解的几大作用及使用方法详解 (2013-01-22 15:13:04) 转载▼ 标签: java 注解 杂谈 分类: Java java 注解,从名字上看是注释,解释.但功能却不仅仅是注释 ...
- attilax.java 注解的本质and 使用最佳实践(3)O7
attilax.java 注解的本质and 使用最佳实践(3)O7 1. 定义pojo 1 2. 建立注解By eclipse tps 1 3. 注解参数的可支持数据类型: 2 4. 注解处理器 2 ...
- paip.java 注解的详细使用代码
paip.java 注解的详细使用代码 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net/att ...
- JAVA 注解的几大作用及使用方法详解【转】
java 注解,从名字上看是注释,解释.但功能却不仅仅是注释那么简单.注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后 某个时刻方便地使用这些数据(通过 解 ...
- 框架基础——全面解析Java注解
为什么学习注解? 学习注解有什么好处? 学完能做什么? 答:1. 能够读懂别人写的代码,特别是框架相关的代码: 2. 让编程更加简洁,代码更加清晰: 3. 让别人高看一眼. spring.mybati ...
- Java注解配置
Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能.注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用.包含在 java.lang.annota ...
随机推荐
- 在 Linux 中查看时区
1.date date +"%Z %z" 或者 date -R 2.timedatectl timedatectl|grep "Timezone" 可以使用 t ...
- 一篇对iOS音频比较完善的文章
转自:http://www.cnblogs.com/iOS-mt/p/4268532.html 感谢作者:梦想通 前言 从事音乐相关的app开发也已经有一段时日了,在这过程中app的播放器几经修改我也 ...
- 2016第七季极客大挑战Writeup
第一次接触CTF,只会做杂项和一点点Web题--因为时间比较仓促,写的比较简略.以后再写下工具使用什么的. 纯新手,啥都不会.处于瑟瑟发抖的状态. 一.MISC 1.签到题 直接填入题目所给的SYC{ ...
- 【Beta】第七次任务发布
PM #103 #85 日常管理&dev版宣传&新增报告管理后台. 后端 #103 报告管理后台后端实现,提供必要API接口及文档说明 验收:符合要求的接口及其说明文档 前端 #89 ...
- 【总结】富有表现力的JavaScript
1.JavaScript的灵活性 JavaScript是目前最流行.应用最广泛的语言之一,它是一种极富表现力的语言,它具有C家族语言所罕见的特性.这种语言允许我们使用各种方式来完成同一个任务或者功能, ...
- Caffe学习
将binaryproto转为npy import caffe % suppose caffe is already in the path of Python import numpy as np i ...
- 如何在latex 中插入EPS格式图片
如何在latex 中插入EPS格式图片 第一步:生成.eps格式的图片 1.利用visio画图,另存为pdf格式的图片 利用Adobe Acrobat裁边,使图片大小合适 另存为.eps格式,如下图所 ...
- Java多线程 5 多线程其他知识简要介绍
一.线程组 /** * A thread group represents a set of threads. In addition, a thread * group can also inclu ...
- std::unique_lock<std::mutex> or std::lock_guard<std::mutex> C++11 区别
http://stackoverflow.com/questions/20516773/stdunique-lockstdmutex-or-stdlock-guardstdmutex The diff ...
- Linux 下 查看以及修改文件权限
查看权限 在终端输入: ls -l xxx.xxx (xxx.xxx是文件名) 那么就会出现相类似的信息,主要都是这些: -rw-rw-r-- 其中: 最前面那个 - 代表的是类型 中间那三个 rw- ...