楼主,使用jdk对动态代理的支持,常用的方法是Proxy.newProxyInstance,它接受三个参数,第一个参数为被代理对象的类加载器,第二个参数为需要代理的接口,这些接口的所有方法都会被代理,第三个参数为建立的InvocationHandler的实例,InvocationHandler实例的invoke方法里放上你的里逻辑 现在就举个实际例子说明吧 由于Jdk提供的代理只能代理接口,所以首先我们建立一个被代理的接口还有他的实现,就用项目中的dao层演示 现在有个用户访问数据库的Userdao,里面有个保存用户的方法,接受一个名字- public interface UserDao {
- void save(String username);
- }
- UserDao的实现类UserDaoImpl
- public class UserDaoImpl implements UserDao {
- @Override
- public void save(String username) {
- System.out.println(username + "存进了数据库");
- }
- }
- 现在想对UserDaoImpl记录日志,写一个处理类LogHandler实现InvocationHandler接口
- public class LogHandler implements InvocationHandler {
- //被代理的对象
- private Object target;
- @Override
- public Object invoke(Object proxy, Method method, Object[] args)
- throws Throwable {
- //对被代理对象target的对应方法进行调用,把代理类接受的参数传递进去
- Object result = method.invoke(target, args);
- System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "用户" + args[0] + "保存进数据库");
- return result;
- }
-
- //接收被代理的对象
- public LogHandler(Object target) {
- super();
- this.target = target;
- }
- }
- 用于测试的有main的类 ProxyTest
- public class ProxyTest {
- public static void main(String[] args) {
- //被代理的UserDaoImpl对象
- UserDao ud = new UserDaoImpl();
- //生成代理对象,转成UserDao引用使用,注意这里不能转为UserDaoImpl的引用,只能使用对应接口,
- //这是由于接口可以规范方法
- UserDao proxy = (UserDao)Proxy.newProxyInstance(
- ud.getClass().getClassLoader()//加载生成代理类的加载器
- , ud.getClass().getInterfaces()//需要代理的接口,这里为UserDao
- , new LogHandler(ud));//日志处理类
- //对代理对象调用save方法
- proxy.save("黑马程序员");
- }
- }
复制代码 控制台打印:黑马程序员存进了数据库
2012-09-06 14:12:23用户黑马程序员保存进数据库怎么样,这样就为UserDaoImpl动态的增加了功能,楼主自己写几个dome,慢慢的弄清楚了,关于动态代理的知识楼主可以去看下张孝祥老师的Java高新技术,张老师讲的特别好,视频下载地址:http://www.itcast.cn/channel/video.shtml#java
|