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.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...
在Java中,静态代理可以通过定义一个代理类来实现,而动态代理则使用`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。动态代理可以在运行时动态地创建代理对象,并且可以在调用代理...
这里我们将深入探讨如何在Java的main方法中实现这个...理解并掌握这一过程对提升Java后端开发能力至关重要。在实际项目中,我们还需要考虑异常处理、安全性(如HTTPS)、性能优化等问题,以确保代码的健壮性和效率。
java图片处理工具类JAR包 java-image-scalingjar
6. 分类识别:使用预先训练的模型(如深度学习的CNN模型或传统的模板匹配方法)对字符进行分类,将其转化为对应的文本。 对于中文字符的识别,Java OCR面临更大的挑战,因为中文字符数量庞大且形状复杂。常用的Java...
jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列...
在Java编程语言中,处理图像是一项常见的任务,包括图片的旋转、翻转和镜像操作。这些功能在很多场景下都很实用,例如照片编辑、图像处理应用或是网页开发。本篇将详细介绍如何使用Java实现这些功能,并以`ImgRotate...
Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建对象、获取类...
Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...
- **Client Stub**: 这是一个客户端代理类,允许开发者调用Web服务的方法,处理SOAP请求和响应。 5. **集成到项目中**: 将生成的Java类导入你的Java项目,然后就可以像调用普通Java方法一样调用Web服务。 6. **...
java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...
本项目“Java+OpenCV+OCR 图像字符处理”聚焦于利用Java编程语言结合OpenCV库和OCR(Optical Character Recognition,光学字符识别)技术来实现这一功能。下面我们将深入探讨这些知识点。 首先,OpenCV是一个开源的...
jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列...
总结来说,这个基于Java开发环境的WebRTC点对点视频通话系统是一个综合性的项目,涵盖了Java与WebRTC的集成、信令处理、媒体流管理等多个技术层面。开发者需要具备扎实的Java基础、良好的网络通信知识,以及对WebRTC...
JMF提供了对RTSP和RTP的API支持,而Xuggler则是一个强大的音视频处理库,可以方便地进行编码、解码以及流处理。 4. RTP/TCP与RTP/UDP模式 RTP/TCP模式下,RTP数据包被封装在TCP连接中,保证了数据的可靠传输,但...
《Java语言程序设计(一)》是自考Java专业的一门重要课程,旨在帮助学习者掌握Java编程的基础知识和技能。这门课程涵盖了Java语言的基本语法、数据类型、控制结构、类与对象、异常处理、输入输出以及简单的多线程...
- **Java代理(Proxy)**: 通过代理类,可以在方法调用前后插入自定义的处理逻辑,实现类似Hook的效果。这可能被用来拦截键盘事件的处理。 - **第三方库**: 如JNA(Java Native Access)或JNI(Java Native ...
在Java客户端,创建了一个JSON格式的字符串作为参数,然后通过WebService的客户端代理类SayHelloService的实例,调用其getSayHelloPort方法得到服务端点SayHelloDelegate的实例。通过这个实例,调用sayHaha方法并将...
// 实现处理回调的方法 } ``` 4. **安全性与注意事项** - **密钥分发中心(KDC)管理**:KDC是Kerberos的核心,负责密钥的分发和验证。确保KDC的安全性至关重要,避免中间人攻击和非法访问。 - **票证生命...