动态代理之jdk/cglib
jdk动态代理
1.先要有一个接口:Seller卖房的,有一个方法sell()卖房
2.实现上边的接口:知春路有一个卖房的房东,实现seller:ZclSeller
3.代理类:链家地产LjdcProxy
1.实现接口:InvocationHandler
2.重写方法:invoke
4.交易Buyer买房
就是这样调用生成相应的类,也不用解释:
Seller seller2 = (Seller) Proxy.newProxyInstance(seller1.getClass().getClassLoader(), seller1.getClass().getInterfaces(), proxy);
package dp.dynamicProxy.jdk; public interface Seller { public void sell(String name); }
package dp.dynamicProxy.jdk; public class ZclSeller implements Seller { @Override public void sell(String name) { System.out.println(name+"知春路卖房。。"); } }
package dp.dynamicProxy.jdk; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class LjdcProxy implements InvocationHandler{ Seller seller; public void beforeSell(){ System.out.println("把相关证明准备齐全,才可以买房"); } public LjdcProxy(Seller seller) { this.seller = seller; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { this.beforeSell(); Object o = method.invoke(seller, args); return o; } }
package dp.dynamicProxy.jdk; import java.lang.reflect.Proxy; /** * 代理模式 * * @author liuzunli * */ public class Buyer { public static void main(String[] args) { Seller seller1 = new ZclSeller(); LjdcProxy proxy = new LjdcProxy(seller1); Seller seller2 = (Seller) Proxy.newProxyInstance(seller1.getClass().getClassLoader(), seller1.getClass().getInterfaces(), proxy); seller2.sell("john"); } }
cglib动态代理
maven
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>3.2.1</version>
</dependency>
1.先要有一个类,不用是接口:知春路卖房的ZclSeller
2.代理类:链家地产LjdcProxy
1.实现接口:MethodInterceptor
2.重写方法:intercept
3.交易Buyer买房
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(ZclSeller.class);//需要代理的类
enhancer.setCallback(new LjdcProxy());//代理
ZclSeller seller1 = (ZclSeller) enhancer.create();//生成需要代理的类实例
package dp.dynamicProxy.cglib; import java.lang.reflect.Method; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class LjdcProxy implements MethodInterceptor{ public void beforeSell(){ System.out.println("把相关证明准备齐全,才可以买房"); } @Override public Object intercept(Object arg0, Method method, Object[] arg2, MethodProxy proxy) throws Throwable { this.beforeSell(); return proxy.invokeSuper(arg0, arg2); } }
package dp.dynamicProxy.cglib; import net.sf.cglib.proxy.Enhancer; /** * 代理模式 * * @author liuzunli * */ public class Buyer { public static void main(String[] args) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(ZclSeller.class); enhancer.setCallback(new LjdcProxy()); ZclSeller seller1 = (ZclSeller) enhancer.create(); seller1.sell("john"); } }
这两者的区别:
jdk动态代理必须是接口
浙公网安备 33010602011771号