动静代理
相比于动态代理是生成代理类和实现类的class文件,动静代理则是动静生成字节码加载到程序中。而且,相比于动态代理须要针对每一个接口去独自写一个代理类,动静代理只须要一个代理类就能够实现(依据传入的被代理类判断)
JDK动静代理
public interface Player { void getGamePoints();}public class ADavids implements Player { private String name = "Anthony Davids"; public void getGamePoints() { System.out.println(name + " get 45 points!"); } }public class ProxyHandler implements InvocationHandler { private Object object; public ProxyHandler(Object object){ this.object = object; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(method.getName()); System.out.println("The player is Coming-------" ); Object obj = method.invoke(object,args); System.out.println("THE END---------------"); return obj; }}public class Test { public static void main(String[] args) { //JDK动静代理 ADavids aDavids = new ADavids(); Object obj = Proxy.newProxyInstance(aDavids.getClass().getClassLoader(),aDavids.getClass().getInterfaces(),new ProxyHandler(aDavids)); Player proxyAfterObj = (Player)obj; proxyAfterObj.getGamePoints(); }}打印后果为:getGamePointsThe player is Coming-------Anthony Davids get 45 points!THE END---------------
CGLIB动静代理
public class EspnNews { public void playnews(){ System.out.println("AD GET 45 PTS TODAY"); }}public class InterceptorTv implements MethodInterceptor { public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("This dailynew -------"); Object obj = methodProxy.invokeSuper(o,objects); System.out.println("Play End -------"); return obj; }}public class ProxyNews { public static Object getProxyObj(Class clazz){ Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(clazz); enhancer.setCallback(new InterceptorTv()); return enhancer.create(); }}public class Test { public static void main(String[] args) { //CGlib动静代理 EspnNews espnNews = (EspnNews) ProxyNews.getProxyObj(EspnNews.class); espnNews.playnews(); }}打印后果为:This dailynew -------AD GET 45 PTS TODAYPlay End -------