代理机制(CglibProxy和JDKProxy)

本文深入探讨了Java代理机制,包括JDK动态代理和Cglib代理的使用。通过示例展示了如何利用这两种方式在方法调用前后添加额外的处理逻辑。JDKProxy主要针对接口进行代理,而Cglib则是对普通类进行代理,尤其适用于无接口或final类的情况。文中还提出了一种根据接口类型选择代理方式的工具类设计方案,并给出了具体的实现和测试案例。
摘要由CSDN通过智能技术生成

意图:为其他对象提供一种代理以控制对这个对象的访问。

主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上(RMI)。比如在这个方法执行时的前后进行前后处理(aop)。

何时使用:想在访问一个对象时做一些控制。

如何解决:增加中间层代理层proxy。

  1. JDKProxy,主要用来对接口及接口对象进行代理。
public class DirectJDKProxy {

	private static Object getProxy(Object object) {
		Class<?> klass = object.getClass();
		//获取类加载器
				ClassLoader classLoader = klass.getClassLoader();
		//获取其所有的接口
				Class<?>[] interfaces = klass.getInterfaces();
		//获取代理对象	

		return Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() {
			
			@Override
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				System.out.println("前置处理");
				Object result = method.invoke(object, args);
				System.out.println("后置处理");
				
				return result;
			}
		});
	}

	public static void main(String[] args) {
		SomeClass someClass = new SomeClass();
		ISomeClass someClassProxy = (ISomeClass) DirectJDKProxy.getProxy(someClass);	
            	String str = someClassProxy.doDealString("这里是原始参数!");
		System.out.println("执行结果:" + str);

		System.out.println("-----------------------------------------");
		str = someClass.doDealString("这是第二次用原对象执行时的原始参数");
		System.out.println(str);
}

执行结果为:

可以看到结果中用代理给方法执行前和执行后加入了代码且执行了,而原对象没有。

也可以从代码中:

        //获取类加载器
                ClassLoader classLoader = klass.getClassLoader();
        //获取其所有的接口
                Class<?>[] interfaces = klass.getInterfaces();
        //获取代理对象    

        return Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() );

可以模糊的看出实际上是代理类继承了所有接口,像是一个复制品,但这个接口复制品可以给里面添加处理方法。

2.CglibProxy:主要是对普通类进行代理:

import java.lang.reflect.Method;

import com.smy.about_proxy.jdk.eg.Complex;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class SimpleCglibProxy {
	private Object object;

	public SimpleCglibProxy() {
	}

	public Object getObject() {
		return object;
	}

	p
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值