Java代理模式

Java代理模式

  • 静态代理
  • 动态代理
  • Cglib

代理模式:
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

静态代理:

public interface UserInterface {
	public void say();
}

public class User implements UserInterface{
	public void say() {
		System.out.println("hello");
	}
}

public class UserStaticProxy implements UserInterface{
	private User user = new User();
	public UserStaticProxy(User user){
		this.user = user;
	}
	@Override
	public void say() {
		System.out.println("静态代理前");
		user.say();
		System.out.println("静态代理后");
	}
}

Output:

动态代理:

public class UserDynamicFactory {
	private Object object;
	public UserDynamicFactory(Object obj){
		this.object = obj;
	}

	public Object getIntance(){
		return Proxy.newProxyInstance(
			object.getClass().getClassLoader(),
			object.getClass().getInterfaces(),
			new InvocationHandler() {
				@Override
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				System.out.println("动态代理前");
				Object o = method.invoke(object);
				System.out.println("动态代理后");
				return o;
			}
		});
	}
}

Output:

Cglib:

public class Staff {
	public void say(){
		System.out.println("Woo!!!!");
	}
}

public class StaffCglib implements MethodInterceptor {
	private Object object;
	public StaffCglib(Object object){
		this.object = object;
	}

	@Override
	public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
		System.out.println("Cglib前");
		Object obj = method.invoke(object);
		System.out.println("Cglib后");
		return obj;
	}
	public Object getInstance(){
		Enhancer en  = new Enhancer();
		en.setSuperclass(object.getClass());
		en.setCallback(this);
		return en.create();
	}
}

OutPut:

测试代码:

public class ProxyTest {
	public static void main(String[] args){
		User user = new User();
		new UserStaticProxy(user).say();
		UserInterface userDynamic = (UserInterface) new UserDynamicFactory(user).getIntance();
		userDynamic.say();
		Staff staffCglib = (Staff)new StaffCglib(new Staff()).getInstance();
		staffCglib.say();
	}
}

注意事项:

测试如果是自己引入jar包,需要引入cglib和asm包(cglib3.1及以上版本和asm2.2以上版本有冲突)

posted @ 2018-07-03 19:26  拼命黑邱plus  阅读(132)  评论(0编辑  收藏  举报