`
a25765339
  • 浏览: 61052 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一句话概括 java 动态代理

 
阅读更多
概括:想要在调用UserSvc的所有方法时,在每个方法前或后都做一些处理,又不想修改实现类,或无法修改实现类的情况下,使用动态代理模式。

接口:
public interface UserSvc {
	public void getUserInfo();
	public void CreateUser();
}

实现类:
public class UserSvcImpl implements UserSvc{

	@Override
	public void getUserInfo() {
		System.out.println("get user info.");
	}

	@Override
	public void CreateUser() {
		System.out.println("create a new user.");
	}

}


动态代理类:(除了你希望的处理细节,这个类的其他地方基本不用改,直接拿来用就行了)
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class UserProxy implements InvocationHandler {

	Object obj = null;

	public Object bind(Object obj) {
		this.obj = obj;
		return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj
				.getClass().getInterfaces(), this);
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("执行被代理的类的方法前,我要做一些处理。");
		method.invoke(this.obj, args);
		System.out.println("执行被代理的类的方法后,我还要做一些处理。");
		System.out.println("");
		return null;
	}

}


测试类:

public class Test {
	public static void main(String[] args) {
		UserProxy proxy = new UserProxy();
		UserSvc userSvc = (UserSvc) proxy.bind(new UserSvcImpl());
		userSvc.getUserInfo();
		userSvc.CreateUser();
	}
}


输出结果:
执行被代理的类的方法前,我要做一些处理。
get user info.
执行被代理的类的方法后,我还要做一些处理。

执行被代理的类的方法前,我要做一些处理。
create a new user.
执行被代理的类的方法后,我还要做一些处理。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics