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



posted @ 2018-05-13 23:29  VictorChang  阅读(86)  评论(0编辑  收藏  举报