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

Java设计模式之动态代理-学习笔记3-1

 
阅读更多

Java5 自带动态代理接口InvocationHadler及创建代理类的Proxy类,我们可以实现该接口来完成动态代理的功能,例如现在我们可以设计一个动态代理例子:当UserDaoImpl在执行save() 方法之前进行保存日志等操作,保存结束执行其他的操作,通过代理来实现,动态代理可以实现:权限检查、做日志、检查效率、管理事务、处理异常等……,代码如下:

coding:

 

//IUserDao 接口
public interface IUserDao {

	public String save();
}


//为UserDao的具体实现类
public class UserDaoImpl implements IUserDao {

	public String save() {
		System.out.println("save ************");
		return "保存成功";
	}
}



import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
//为UserDaoImpl的代理对象
public class UserDaoImplProxy implements InvocationHandler {

	// 代理的目标对象
	private Object target;

	public UserDaoImplProxy(Object target) {
		super();
		this.target = target;
	}

	public void before() {
		System.out.println("save start ***********");
	}

	@Override
	public Object invoke(Object proxy, Method m, Object[] args)
			throws Throwable {

		// 代理对象添加对应的业务处理逻辑 加日志、检查权限*******
		before();

		// UserDaoImpl的save()方法开始执行
		Object obj = m.invoke(target, args);

		// 方法执行结束 进行清空等操作
		after();

		return obj;
	}

	public void after() {
		System.out.println("save over ************");
	}
}



import java.lang.reflect.Proxy;

//测试客户端
public class Client {

	public static void main(String[] args) {

		// 被代理对象
		IUserDao udao = new UserDaoImpl();

		// 代理对象
		IUserDao px = (IUserDao) Proxy.newProxyInstance(udao.getClass()
				.getClassLoader(), UserDaoImpl.class.getInterfaces(),
				new UserDaoImplProxy(udao));

		String sx = px.save();

		System.out.println(sx);
	}
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics