`
lizhensan
  • 浏览: 377624 次
  • 性别: 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图片处理工具类JAR包 java-image-scalingjar

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

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

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

    java错误处理:java.lang.OutOfMemoryError: Java heap space

    - 描述提到了对这个问题的相关资料进行整理,这意味着该文档将提供如何识别、分析并解决此类问题的方法。 #### 详细解析 **异常出现的原因:** 1. **内存分配不足**:默认情况下,JVM启动时分配的堆内存可能不...

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

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

    java中main方法发送httpPost请求

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

    java开源包4

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

    java.io.CharConversionException: isHexDigit处理

    escape() 函数只是一个基础的编码函数,无法处理所有的特殊字符,因此在 URL 传值时需要使用 encodeURIComponent() 函数对参数进行编码。此外,在服务器端获取参数时,需要正确地对参数进行解码,以避免编码不正确的...

    java 图片旋转、翻转、镜像处理

    在Java编程语言中,处理图像是一项常见的任务,包括图片的旋转、翻转和镜像操作。这些功能在很多场景下都很实用,例如照片编辑、图像处理应用或是网页开发。本篇将详细介绍如何使用Java实现这些功能,并以`ImgRotate...

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

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

    java api最新7.0

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

    Java+OpenCV+OCR 图像字符处理

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

    java开源包9

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

    java开源包5

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

    java开源包8

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

    java解析dbf文件三种方法、以及解析驱动

    这种方式利用了Java JDBC技术,通过安装特定的驱动程序,可以将DBF文件视为一个数据库表,并使用标准SQL语句对其进行查询和操作。这种方法的优势在于可以利用现有的SQL技能进行数据处理,同时也支持更复杂的查询和...

    Java实现软键盘代码,HOOK调用

    - **Java代理(Proxy)**: 通过代理类,可以在方法调用前后插入自定义的处理逻辑,实现类似Hook的效果。这可能被用来拦截键盘事件的处理。 - **第三方库**: 如JNA(Java Native Access)或JNI(Java Native ...

    java调用json参数的webservice

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

    kerberos的java实现

    // 实现处理回调的方法 } ``` 4. **安全性与注意事项** - **密钥分发中心(KDC)管理**:KDC是Kerberos的核心,负责密钥的分发和验证。确保KDC的安全性至关重要,避免中间人攻击和非法访问。 - **票证生命...

    java开源包3

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

    曲线拟合计算(java实现)

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

Global site tag (gtag.js) - Google Analytics