基础类,创建一个接口和一个实现方法
package com.opk.proxy;
public interface BuyHouse {
void buyHouse();
}
package com.opk.proxy;
public class BuyHouseImpl implements BuyHouse {
@Override
public void buyHouse() {
System.out.println("我要买房");
}
}
静态代理的实现
package com.opk.proxy;
public class BuyHouseProxy implements BuyHouse {
private BuyHouse buyHouse;
public BuyHouseProxy(final BuyHouse buyHouse) {
this.buyHouse = buyHouse;
}
@Override
public void buyHouse() {
System.out.println("买房前准备");
buyHouse.buyHouse();
System.out.println("买房后装修");
}
}
package com.opk.proxy;
public class ProxyTest {
public static void main(String[] args) {
BuyHouse buyHouse=new BuyHouseImpl();
buyHouse.buyHouse();
BuyHouseProxy buyHouseProxy=new BuyHouseProxy(buyHouse);
buyHouseProxy.buyHouse();
}
}
测试结果:

动态代理的实现
1、使用本地方法实现动态代理
package com.opk.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DynamicProxyHandler implements InvocationHandler {
private Object object;
public DynamicProxyHandler(Object object) {
this.object = object;
}
@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;
}
}
package com.opk.proxy;
import java.lang.reflect.Proxy;
public class DynamicProxyTest {
public static void main(String[] args) {
BuyHouse buyHouse = new BuyHouseImpl();
BuyHouse proxyBuyHouse = (BuyHouse) Proxy.newProxyInstance(BuyHouse.class.getClassLoader(), new
Class[]{BuyHouse.class}, new DynamicProxyHandler(buyHouse));
proxyBuyHouse.buyHouse();
}
}
测试结果:

2、使用cglib实现动态代理
package com.opk.proxy;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class CglibProxy implements MethodInterceptor {
private Object target;
public Object getInstance(final Object target)
{
this.target=target;
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(this.target.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("买房前准备");
Object invoke = methodProxy.invokeSuper(o, objects);
System.out.println("买房后装修");
return invoke;
}
}
package com.opk.proxy;
public class CglibProxyTest {
public static void main(String[] args) {
BuyHouse buyHouse=new BuyHouseImpl();
CglibProxy cglibProxy=new CglibProxy();
BuyHouseImpl instance = (BuyHouseImpl) cglibProxy.getInstance(buyHouse);
instance.buyHouse();
}
}
测试结果:

总结:cglib实现动态代理效率会比本地方法高,但是创建对象频繁,如果是单例对象使用cglib实现动态代理,反之,则使用java的本地方法
来源:https://www.cnblogs.com/mingyuan1031/p/11551393.html