package proxy2; /** * * 如何对如下方法,统一添加一个前后处理的逻辑呢? * 有静态的、有非静态的?如何统一处理? */ public class BizCls2 { public static void staticMethod1() { System.out.println("处理方法1"); } public static void staticMethod3(String args) { System.out.println("处理方法3"+args); } public void method2(String args) { System.out.println("处理方法2"+args); } }
package proxy2; import org.apache.commons.lang3.reflect.MethodUtils; /** * 静态方法通过硬编码的形式来实现 */ public class BizStaticMethodCaller { public static <T> T callWithLog(Class<?> type, String method, Object... parms) throws Exception { System.out.println("前处理日志打印,参数"+parms); Object ret = MethodUtils.invokeStaticMethod(type, method, parms); System.out.println("后处理日志打印"); return (T) ret; } }
package proxy2; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; /** * 动态代理只能处理 非静态的方法,非静态的方法通过该形式进行处理 */ public class CglibProxy implements MethodInterceptor { static CglibProxy instence=new CglibProxy(); public static <T> T getProxyInstance(Class<T> type) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(type); enhancer.setCallback(instence); return (T) enhancer.create(); } @Override public Object intercept(final Object target, Method method, final Object[] args, final MethodProxy proxy) throws Throwable { System.out.println("前处理日志打印,参数" + args); Object result = proxy.invokeSuper(target, args); System.out.println("后处理日志打印"); return result; } }
package proxy2; /** * * 使用方式 */ public class TestCiglib { public static void main(String[] args) throws Exception { // 静态方法 的调用方式,ide的代码提示、效验、查找引用不太好用了 ,不过也可以对IDE的扩展进行弥补 // 推荐非静态的方法 BizStaticMethodCaller.callWithLog(BizCls2.class, "staticMethod1"); BizStaticMethodCaller.callWithLog(BizCls2.class, "staticMethod3", "333"); // 如何使非静态的方法,统一采用 动态代理的形式,所以对象应有统一的地方创建 BizCls2 hello = CglibProxy.getProxyInstance(BizCls2.class); // 非静态的,通过代理来完成 hello.method2("22"); } }
运行结果:
前处理日志打印,参数[Ljava.lang.Object;@12b6651
处理方法1
后处理日志打印
前处理日志打印,参数[Ljava.lang.Object;@124bbbf
处理方法3333
后处理日志打印
前处理日志打印,参数[Ljava.lang.Object;@1960f05
处理方法222
后处理日志打印
应该还有一种很暴力的方式就是 采用 ASM 对java字节 添加一些额外的代码来实现
google 搜 ASM AOP 很多例子
相关推荐
对项目中的所有参数去除前后空格过滤,统一处理参数!可以基于此过滤器实现过滤跨站脚本攻击,参数的增加,修改!敏感词汇过滤。实现原理为重写HttpServletRequestWrapper,获取参数的方法。include和 Forwarded ...
Java 实现免费代理IP的获取方式 并动态实时校验是否有效,java文件项目内含有Jsoup...其二:对已下载到本地的代理IP进行再筛选,对失效的代理IP进行处理,对任然有效的ip进行保存 结语:如果对你有帮助,请为我评论点赞
java一次性查询处理几百万数据解决方法 几百万数据是可以处理的 暂时还没试过几千万级的数据处理
Java代理服务器的实现
Java写http代理服务器
由于正则表达式定了一些特殊字符,而有时候需要对这些特殊字符进行匹配的话就需要进行转义了,下面这篇文章主要给大家介绍了Java正则表达式处理特殊字符转义的方法,需要的朋友可以参考借鉴,下面来一起看看吧。
而Java的动态代理在代理上更进一步,既能动态的创建代理对象,又能动态的调用代理 方法。Java的反射和动态代理机制,使Java变得更加强大。 Spring框架这几年风头正劲, 虽然使用者众多,但真正了解其内部实现原理的...
N个线程对完成的A表数据做最后处理 支持大数据量跑批,就是个例子,本来是公司发送促销邮件用的,欢迎提意见和建议。 运行DispatcherMain可以测试,库结构自己可以根据code随便改成父子表关系的就行
调用WebService,最简单的办法当然是直接添加WEB引用,然后自动产生代理类,但是在调用JAVA的WebService时并没有这么简单,特别是对于SoapHeader的处理,通过C#添加Web引用方式访问JavaWebService的方法,除了string...
jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列...
java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...
java 批量上传图片
Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...
java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...
jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列...
jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列...
jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列...
jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列...
按公司的要求自己测试好久才整出来的,好用,给大家共享一下,有什么问题可以问我