JDK和cglib动态代理代码示例

JDK和cglib动态代理代码:

package com.zhangxueliang.demo.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JDKProxyFactory implements InvocationHandler{

	private Object target;
	
	public JDKProxyFactory(Object target){
		this.target=target;
	}
	
	public Object createProxy(){
		ClassLoader classLoader = target.getClass().getClassLoader();
		Class<?>[] interfaces = target.getClass().getInterfaces();
		return Proxy.newProxyInstance(classLoader, interfaces, this);
		
	}

	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("增强--日志操作。。。。。。。。。。。");
		return method.invoke(target, args);
	}
	
}
package com.zhangxueliang.demo.proxy;

import java.lang.reflect.Method;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

public class CglibProxyFactory implements MethodInterceptor {
	private Object target;
	public CglibProxyFactory(Object target){
		this.target=target;
	}
	
	public Object createProxy(){
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(target.getClass());
		enhancer.setCallback(this);
		return enhancer.create();
	}

	public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
		System.out.println("cglib日志操作。。。。。。。。");
		return method.invoke(target,args);
	}
}
package com.zhangxueliang.demo.proxy;

public class Test {
	public static void main(String[] args) {
//		testJdkProxy();
		UserServiceImpl u = new UserServiceImpl();
		CglibProxyFactory c = new CglibProxyFactory(u);
		UserServiceImpl us = (UserServiceImpl) c.createProxy();
		us.login("0000", "123456");
	}

	private static void testJdkProxy() {
		UserServiceImpl u = new UserServiceImpl();
		JDKProxyFactory f = new JDKProxyFactory(u);
		IUserService us = (IUserService) f.createProxy();
		us.login("1111", "2222");
	}
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
CGlib是一个针对Java字节码的代码生成库,它可以在运行时扩展Java类和实现接口的功能。它通过生成目标类的子类来实现代理,从而实现了动态代理的功能。 在使用CGlib动态代理时,首先需要添加CGlib库的依赖。然后,创建一个Enhancer对象,并设置被代理类作为目标类。接下来,可以通过调用Enhancer对象的方法来设置回调函数和拦截器等。最后,使用Enhancer对象的create方法生成代理类的实例。 以下是一个简单的示例代码,演示了如何使用CGlib动态代理: ```java import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; public class Main { public static void main(String[] args) { // 创建Enhancer对象 Enhancer enhancer = new Enhancer(); // 设置被代理类 enhancer.setSuperclass(TargetClass.class); // 设置回调函数 enhancer.setCallback(new MethodInterceptor() { @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { // 在方法调用前进行拦截处理 System.out.println("Before method: " + method.getName()); // 调用被代理类的方法 Object result = proxy.invokeSuper(obj, args); // 在方法调用后进行拦截处理 System.out.println("After method: " + method.getName()); return result; } }); // 生成代理类的实例 TargetClass proxy = (TargetClass) enhancer.create(); // 调用代理类的方法 proxy.doSomething(); } } class TargetClass { public void doSomething() { System.out.println("Doing something..."); } } ``` 在上面的示例中,我们创建了一个名为TargetClass的被代理类。然后使用CGlib动态代理生成了一个代理类的实例,并通过调用代理类的方法来间接调用被代理类的方法。在方法调用前后,我们可以通过设置回调函数来添加额外的处理逻辑。 需要注意的是,CGlib动态代理是通过继承来实现的,因此对于final类和方法无法进行代理。另外,由于CGlib是基于字节码操作实现的,所以在生成代理类的过程中会比较耗时。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学亮编程手记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值