日期:2014-05-20  浏览次数:20850 次

Java动态代理的作用
如题,Java中动态代理有点迷惑,在网上看到的代码都是如下这类:
//定义接口
public interface Foo
{
  void doAction();
}
//实现一
public class FooImpl implements Foo
{
  public FooImpl()
  {
  }

  public void doAction()
  {
  System.out.println("in FooImp1.doAction()");
  }
}
//实现二
public class FooImpl2 implements Foo
{
  public FooImpl2()
  {
  }
  public void doAction()
  {
  System.out.println("in FooImp2.doAction()");
  }

}
//代理类
public class DynamicSubject implements InvocationHandler
{
  private Object sub;

  public DynamicSubject()
  {
  }

  public DynamicSubject(Object obj)
  {
  sub = obj;
  }

  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
  {
  System.out.println("before calling " + method);

  method.invoke(sub, args);

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

  return null;
}

}
//测试
public class Demo
{
public static void main(String[] args)
{

// 1.通用的动态代理实现

CommonInvocationHandler handler = new CommonInvocationHandler();

Foo f;

// 2.接口实现1

handler.setTarget(new FooImpl());

f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),

new Class[] { Foo.class },

handler);

f.doAction();

// 3.接口实现2

handler.setTarget(new FooImpl2());

f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),

new Class[] { Foo.class },

handler);

f.doAction();
}
}
----------->>也就是面向接口编程,完全可以写一个工厂类实现的,为什么要采用这个方式,如:

class Factory{
Foo fo ;
public Factory(Foo fo){
this.fo = fo;
}
public Foo getInstence(){
return fo;
}
}
然后创建Factory对象
=============》》 有什么差别么??



------解决方案--------------------
可以实现 AOP 啊,可以运行一下下面的代码,也是原来回复过,粘过来的,呵呵(为了便于调试全部写在一个文件里了)

Java code

byte[] buf = new byte[1024];

FileInputStream in = new FileInputStream("D:\\dvd.avi");                
FileOutputStream out = new FileOutputStream("D:\\dvd1.avi");
            
int len;
while ((len = in.read(buf)) > 0) {    
     out.write(buf, 0, len);    
}
        
in.close();
out.flush();
out.close();

------解决方案--------------------
你要知道动态代理的主要作用是什么,以下是我个人理解动态代理: 
动态代理的主要作用就是:实现了日志和业务的分开,也就是某个类只是要提供了某些业务,比如银行取款业务。
这个类实现了取款业务的同时也需要实现日志功能,如果不用动态代理的话,那么由此一来该类代码里面已经额外地添加了自己不该添加的日志功能能代码。所以我们就得使用动态代理把它的业务代码和日志功能代码分开。所以用到了动态代理概念,spring里面的AOP就是一个很好的例子。 

希望对你 有帮助!!!
------解决方案--------------------
探讨
你要知道动态代理的主要作用是什么,以下是我个人理解动态代理:
动态代理的主要作用就是:实现了日志和业务的分开,也就是某个类只是要提供了某些业务,比如银行取款业务。
这个类实现了取款业务的同时也需要实现日志功能,如果不用动态代理的话,那么由此一来该类代码里面已经额外地添加了自己不该添加的日志功能能代码。所以我们就得使用动态代理把它的业务代码和日志功能代码分开。所以用到了动态代理概念,spring里面…