A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵宇 中级黑马   /  2012-9-24 16:48  /  1638 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 赵宇 于 2012-9-25 08:35 编辑

步骤
1.创建一个实现接口InvocationHandler的类,它必须实现invoke方法
2.创建被代理的类以及接口
3.通过Proxy的静态方法
newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) 创建一个代理
4.通过代理调用方法
具体实现例子
1.接口
public interface Subject
{
          public void request();
}

2,真实角色
public class RealSubject implements Subject
{
@Override
          public void request()
       {
       System.out.println("From real subject.");
       }
}
3、
实现接口InvocationHandler的类,它实现invoke方法
  1. ublic class DynamicSubject implements InvocationHandler
  2. {
  3. private Object sub;


  4. public DynamicSubject(Object obj)
  5. {
  6. this.sub = obj;
  7. }

  8. @Override
  9. public Object invoke(Object proxy, Method method, Object[] args)
  10. throws Throwable
  11. {
  12. System.out.println("before calling :" + method);


  13. method.invoke(sub,args);



  14. System.out.println("after calling :" + method);

  15. return null ;
  16. }

  17. }
复制代码
4.Client
  1. public class Clent
  2. {
  3. public static void main(String[] args)
  4. {
  5. RealSubject realSubject = new RealSubject();

  6. InvocationHandler handler = new DynamicSubject(realSubject);

  7. Class<?> classType = handler.getClass();



  8. Subject subject = (Subject) Proxy.newProxyInstance(classType
  9. .getClassLoader(), realSubject.getClass().getInterfaces(),
  10. handler);

  11. subject.request();

  12. System.out.println(subject.getClass());

  13. }








  14. }
复制代码
综上所述 ,对动态代理的理解又上了一个台阶,希望对大家有帮助。


评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
楼主我有些问题想问你:
1.Subject是类,应该继承吧,Subject里没有request方法,所以无法重写。。。
2.我对动态类理解得不好,还中学习中。。。。
Subject subject = (Subject) Proxy.newProxyInstance(classType.getClassLoader(), realSubject.getClass().getInterfaces(),handler);楼主这句代码它要实现什么功能吗???

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
3.看了楼主的代码。。。有个疑问:创建动态类的目的就是要给客户端传递实例对象吗???可能这个问题有点弱。呵呵。。张老师的视频看了好几遍还是不懂。。。
回复 使用道具 举报
张文建 发表于 2012-9-24 19:23
楼主我有些问题想问你:
1.Subject是类,应该继承吧,Subject里没有request方法,所以无法重写。。。
2.我 ...

1、必须强调的是 Subject 必须是一个接口,不能是类。
2,Subject subject = (Subject) Proxy.newProxyInstance(classType.getClassLoader(), realSubject.getClass().getInterfaces(),handler);楼主这句代码它要实现什么功能吗???
动态的生成一个类。类型 由红色部分的接口类型决定。
回复 使用道具 举报
张文建 发表于 2012-9-24 19:26
3.看了楼主的代码。。。有个疑问:创建动态类的目的就是要给客户端传递实例对象吗???可能这个问题有点弱 ...

07.InvocationHandler handler = new DynamicSubject(realSubject);

08.

09.Class<?> classType = handler.getClass();

10.

11.

12.

13.Subject subject = (Subject) Proxy.newProxyInstance(classType

14..getClassLoader(), realSubject.getClass().getInterfaces(),

15.handler);


就是很多对象都用一个代理,传递不同的对象,产生不同的代理,进而调用不同的对象的方法,但是这期间不变的是这个代理,只有一个

不像静态代理的,一个对象需要一个代理,能理解吗?
回复 使用道具 举报
赵宇 发表于 2012-9-24 19:53
07.InvocationHandler handler = new DynamicSubject(realSubject);

08.

有点眉头啦。。。。。呵呵
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马