因为过去业务总是这样,在调用一个类的开始时候要执行某些操作,在执行后也要执行某些操作,这样我就写了一个动态代理类,来执行这些操作,可是他只能执行接口的方法,这样的话,每一个类,要想有这种功能,就要给自己的方法定义一个接口,这样很麻烦,能不能这个类没有接口,也可以使用动态代理类?
 
下面是我的实现
动态代理类
package Proxy;
 
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
 public class MethodProxy implements InvocationHandler {
    
    /*
     * 代理对象的实例
     */
    private Object wrapped;
    
    /*
     * 私有的构造方法,不能实例化
     */
    private MethodProxy(Object p) {
        wrapped = p;
    }
    
    /**
     *  实现InvocationHandler接口的方法
     */
    public Object invoke(Object proxy, Method method, Object[] args)
           throws Throwable {
        System.out.println("调用"+method.getClass().getName() + "." + method.getName()+"开始");
        Object obj = method.invoke(wrapped, args);
        System.out.println("调用"+method.getClass().getName() + "." + method.getName()+"结束");
        return obj;
    }
    
    
    public static Object createBuilder(Object toWrap) {
        return Proxy.newProxyInstance(toWrap.getClass().getClassLoader(),
                toWrap.getClass().getInterfaces(),
                new MethodProxy(toWrap));
    }
}
 
测试类
package Proxy;
 public class TestProxy {
    public static void main(String[] args) {
        IPerson p = (IPerson)MethodProxy.createBuilder(new Person());
        p.say();
        ICat c = (ICat)MethodProxy.createBuilder(new Cat());
        c.catchMouse();
        IPerson pc = (IPerson) c;
        pc.say();
    }
}
 
几个实现
接口
package Proxy;
 
public interface ICat {
    public void catchMouse() ;
}
 
package Proxy;
 
public interface IPerson {
    public void say();
}
 
实现
 
package Proxy;
 public class Cat implements ICat,IPerson {
 
    /* (non-Javadoc)
     * @see Proxy.ICat#catchMouse()
     */
    public void catchMouse() {
       System.out.println("mouse");
    }
    
    public void say() {
        System.out.println("I'm cat");
    }
 
}
 
package Proxy;
 
public class Person implements IPerson{
    
    public void say() {
        System.out.println("Hello");
    }
 
}

解决方案 »

  1.   

    Spring中,引入了CGLib作为无接口情况下的动态代理实现。
    CGLib与Dynamic Proxy的代理机制基本类似,只是其动态生成的代理对象并非某个
    接口的实现,而是针对目标类扩展的子类。
      

  2.   

    另外,public Object invoke(Object proxy, Method method, Object[] args)如果你在该方法中没有用到proxy参数,则一般的类也是可以的。下面的例子在jbuilder2005中运行正常:package testspring;import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    public class MethodProxy implements InvocationHandler {  private Object oriObject;  public Object bind(Object obj)
      {
        oriObject = obj;
        return Proxy.newProxyInstance(
                obj.getClass().getClassLoader(),
                obj.getClass().getInterfaces(),
                this);
      }  public Object invoke(Object proxy, Method method, Object[] args)
          throws Throwable
      {
        Object result = null;
        System.out.println("Before Hello World!");
        result = method.invoke(oriObject,args);
        System.out.println("After Hello world!");
        return result;
      }
    }package testspring;public class SayHello {
      public void SayHello()
      {
        System.out.println("Hello World!");
      }
    }package testspring;import testspring.MethodProxy;
    import testspring.SayHello;
    import java.lang.reflect.Method;public class test {
      public test() {
      }  public static void main(String[] args)throws Exception,Throwable
      {
        test t = new test();
        MethodProxy handler = new MethodProxy();
        Object hello = Class.forName("testspring.SayHello").newInstance();
        Method m = Class.forName("testspring.SayHello").getMethods()[0];
        handler.invoke(handler.bind(hello),m,null);
      }
    }
      

  3.   

    MethodProxy 还是用到了interface,你说的CGLib我也正在看,可是还没有看得太明白:(