`
lizhensan
  • 浏览: 382915 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java 代理 对一批方法 的前后进行特殊处理

    博客分类:
  • java
 
阅读更多
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 很多例子

 

分享到:
评论

相关推荐

    JAVA_API1.6文档(中文)

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

    利用Java的反射与代理实现IOC模式

    在Java中,静态代理可以通过定义一个代理类来实现,而动态代理则使用`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。动态代理可以在运行时动态地创建代理对象,并且可以在调用代理...

    Java多线程调用BlockingDeque跑批量数据的例子

    N个线程对完成的A表数据做最后处理 支持大数据量跑批,就是个例子,本来是公司发送促销邮件用的,欢迎提意见和建议。 运行DispatcherMain可以测试,库结构自己可以根据code随便改成父子表关系的就行

    java中main方法发送httpPost请求

    这里我们将深入探讨如何在Java的main方法中实现这个...理解并掌握这一过程对提升Java后端开发能力至关重要。在实际项目中,我们还需要考虑异常处理、安全性(如HTTPS)、性能优化等问题,以确保代码的健壮性和效率。

    java图片处理工具类JAR包 java-image-scalingjar

    java图片处理工具类JAR包 java-image-scalingjar

    java开源包4

    jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列...

    java反射,获取所有属性、方法以及List集合类

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建对象、获取类...

    java源码包---java 源码 大量 实例

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    java钩子实现源码

    这个机制基于Java的动态代理和反射API,使得我们可以在程序运行时对某些行为进行拦截和处理。在Java中,钩子通常用于调试、监控、日志记录或者安全控制等场景。 首先,我们要理解Java中的反射API。反射是Java语言的...

    把wsdl文件转换成java类 使用wsdl2Java工具

    - **Client Stub**: 这是一个客户端代理类,允许开发者调用Web服务的方法,处理SOAP请求和响应。 5. **集成到项目中**: 将生成的Java类导入你的Java项目,然后就可以像调用普通Java方法一样调用Web服务。 6. **...

    java调用C#封装的dll方法

    #### 第一种方法:Java利用JNA进行调用 **背景介绍:** 为了实现Java与C#之间的交互,一种常用的方式是通过调用C#封装的DLL文件来完成特定功能。这种方法涉及到.NET Framework与Java平台之间的互操作性问题。其中一...

    Java+OpenCV+OCR 图像字符处理

    本项目“Java+OpenCV+OCR 图像字符处理”聚焦于利用Java编程语言结合OpenCV库和OCR(Optical Character Recognition,光学字符识别)技术来实现这一功能。下面我们将深入探讨这些知识点。 首先,OpenCV是一个开源的...

    java开源包9

    jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列...

    java api最新7.0

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

    java开源包5

    jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列...

    java笔记 java笔记

    构造方法是一种特殊的方法,用于初始化对象。 ##### 6.8 封装 封装是指隐藏对象的内部细节,并仅通过公共接口访问这些对象的能力。 ##### 6.9 方法的重载 方法重载是指在同一类中定义多个同名方法,但参数列表...

    基于Java的RTSP服务源码

    JMF提供了对RTSP和RTP的API支持,而Xuggler则是一个强大的音视频处理库,可以方便地进行编码、解码以及流处理。 4. RTP/TCP与RTP/UDP模式 RTP/TCP模式下,RTP数据包被封装在TCP连接中,保证了数据的可靠传输,但...

    Java读取json文件并对json数据进行读取、添加、删除与修改操作

    开发过程中经常会遇到json数据的处理,而单独对json数据进行增删改并不方便,尤其是Geojson文件的处理,通过对网络资料的整理总结,下面介绍Java语言方法对json数据进行读取、添加、删除与修改操作。

    曲线拟合计算(java实现)

    Java作为一种通用的编程语言,提供了丰富的库和工具来实现曲线拟合。在这个项目中,作者使用Java实现了曲线和直线的拟合功能。 在Java中,曲线拟合通常涉及到数值分析和线性代数的知识。首先,我们需要理解数据点的...

    java调用json参数的webservice

    在Java客户端,创建了一个JSON格式的字符串作为参数,然后通过WebService的客户端代理类SayHelloService的实例,调用其getSayHelloPort方法得到服务端点SayHelloDelegate的实例。通过这个实例,调用sayHaha方法并将...

Global site tag (gtag.js) - Google Analytics