zoukankan      html  css  js  c++  java
  • 静态代理-动态代理模式、cglib与JDK提供的动态代理之间的区别

    静态代理:( 1个接口,2个实现类 ,1个真实类、1个代理类          N个接口,2*N个实现类 )

    package test513a;
    
    import java.lang.reflect.Constructor;
    
    interface ISubject{
    	void eat();
    }
    
    class RealSubject implements ISubject{
    	@Override
    	public void eat() {
    		System.out.println("eat......");
    	}
    }
    
    class ProxySubject implements ISubject{
    	ISubject iSubject;
    	public ProxySubject(ISubject iSubject) {
    		this.iSubject = iSubject;
    	}
    	public void before() {
    		System.out.println("吃饭前");
    	}
    	public void after() {
    		System.out.println("吃饭后");
    	}
    	@Override
    	public void eat() {
    		before();
    		iSubject.eat();
    		after();
    	}
    }
    
    class Factory{
    	private Factory() {}
    	
    	public static <T> T getInstance(String RealSubject) {
    		T t=null;
    		try {
    			t = (T)Class.forName(RealSubject).newInstance();
    		} catch (InstantiationException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IllegalAccessException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (ClassNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return t;
    	}
    	
    	public static <T> T getInstance(String proxy,String real)throws Exception {
    		T r = getInstance(real);
    		T t = null;
    		Constructor<?> cons = Class.forName(proxy).getConstructor(r.getClass().getInterfaces()[0]);
    		t = (T)cons.newInstance(r);
    		return t;
    	}
    }
    
    public class Test {
    	public static void main(String[] args) throws Exception {
    		ISubject subject = Factory.getInstance("test513a.ProxySubject", "test513a.RealSubject");
    		subject.eat();
    	}
    }
    

    动态代理:(1个接口,1个真实业务            N个接口,N+1个实现类)

    1.动态代理需要实现 InvocationHandler 接口,实现invoke()方法

    2.动态获取代理类对象 Proxy.newProxyInstance( );

    package test513b;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    interface ISubject {
    	void eat(String name, int num);
    }
    
    class RealSubject implements ISubject{
    	
    	public void eat(String name, int num) {
    		System.out.println("我要吃"+num+"份"+name);
    	}
    }
    
    interface IDreak {
    	void dreak(String name, int num);
    }
    
    class RealDreak implements IDreak{
    
    	@Override
    	public void dreak(String name, int num) {
    		System.out.println("我能喝"+num+"瓶"+name);
    	}
    }
    
    class ProxySubject implements InvocationHandler{
    	private Object target;
    	
    	public Object bind(Object target) {
    		this.target = target;
    		return Proxy.newProxyInstance(target.getClass().getClassLoader(), 
    				target.getClass().getInterfaces(), this);
    	}
    	
    	public void beforeHandler() {
    		System.out.println("[ProxySubject]处理前");
    	}
    	public void afterHandler() {
    		System.out.println("[ProxySubject]处理后");
    	}
    	
    	
    	@Override
    	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    		this.beforeHandler();
    		Object ret = method.invoke(this.target, args);
    		this.afterHandler();
    		return ret;
    	}
    	
    }
    
    public class Test {
    	public static void main(String[] args) {
    		ISubject subject = (ISubject) new ProxySubject().bind(new RealSubject());
    		subject.eat("小龙虾", 20);
    		
    		IDreak dreak = (IDreak) new ProxySubject().bind(new RealDreak());
    		dreak.dreak("啤酒", 15);
    		
    	}
    }
    


    cglib动态代理:基于类的动态代理模式,可以没有接口。



  • 相关阅读:
    [HNOI2010]CITY 城市建设

    [HNOI2011]数学作业
    [NOI2012]美食节
    [HEOI2014]大工程
    [HEOI2013]ALO(待更)
    [HEOI2016/TJOI2016]序列
    贪食蛇(未完待续)
    [HEOI2016/TJOI2016]字符串
    bzoj 2437[Noi2011]兔兔与蛋蛋 黑白染色二分图+博弈+匈牙利新姿势
  • 原文地址:https://www.cnblogs.com/yongtaochang/p/13615339.html
Copyright © 2011-2022 走看看