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动态代理:基于类的动态代理模式,可以没有接口。



  • 相关阅读:
    『Asp.Net 组件』第一个 Asp.Net 服务器组件:自己的文本框控件
    『Asp.Net 组件』Asp.Net 服务器组件 的开发优势和劣势
    『开源』简单的代码统计工具 开源啦[有图有真相]
    文件中的类都不能进行设计,因此未能为该文件显示设计器。设计器检查出文件中有以下类: FormMain --- 未能加载基类
    DB2:FETCH FIRST 1 ROWS ONLY
    IEnumerable的几个简单用法
    一个字符串中包含逗号个数
    字符串处理总结之一(C#String类)
    C# 中DateTime的各种使用
    C# 键值对类相关
  • 原文地址:https://www.cnblogs.com/yongtaochang/p/13615339.html
Copyright © 2011-2022 走看看