理解动态代理的实现过程

来源:互联网 发布:linux vim颜色主题 编辑:程序博客网 时间:2024/05/17 08:10

我在api文档中的java.lang.reflect.proxy中看到一个简明易懂的小例子可以很好吧帮助我理解动态代理类生成的过程,我把它完善了一下然后再eclipse上做试验。

 

 

import java.lang.reflect.*;

 

public class t2{

    public static void main(String[] args)throws Exception{

    InvocationHandler handler = new MyInvocationHandler();//调用处理程序的实例

    Class proxyClass = Proxy.getProxyClass(foo.class.getClassLoader(),foo.class);//这里就在运行过程中得到一个类,要得到//一个类就需要类加载器和这个所要实现的接口,

                                                                                 //把他俩放在参数里就行了,在原例子中foo.class 放在一个new//Class[]{foo.class}数组中,这样就可以

                                                                                 //实现多个接口了        

    System.out.println(proxyClass.getName()+" "+proxyClass.getSuperclass());

 

    for(Method m:proxyClass.getMethods()){

       System.out.println("Methods"+" "+m);//受到好奇心的驱使,在这里我试着打印出代理类中的方法。

       }

    foo f = (foo)proxyClass.getConstructor(InvocationHandler.class).newInstance(handler);//拿到构造方法,创建实例

    f.dosomething();

       }  

    }

interface foo {

    void dosomething();

}

 

class MyInvocationHandler implements InvocationHandler {

 

    @Override

    public Object invoke(Object proxy, Method method, Object[]args)

           throws Throwable {

       System.out.println("HelloWorld");

       return null;

    }

   

}

 

 

 

现在我理解接口加反射什么都能做”,这就话好像说的就是动态代理类。不需要编辑类,通过定义接口和使用反射的方法在程序执行的时候生成类。

 

下面是运行结果

 

$Proxy0 class java.lang.reflect.Proxy

Methods public final void $Proxy0.dosomething()

Methods public final boolean $Proxy0.equals(java.lang.Object)

Methods public final java.lang.String $Proxy0.toString()

Methods public final int $Proxy0.hashCode()

Methods public static boolean java.lang.reflect.Proxy.isProxyClass(java.lang.Class)

Methods public static java.lang.Class java.lang.reflect.Proxy.getProxyClass(java.lang.ClassLoader,java.lang.Class[]) throws java.lang.IllegalArgumentException

Methods public static java.lang.reflect.InvocationHandler java.lang.reflect.Proxy.getInvocationHandler(java.lang.Object) throws java.lang.IllegalArgumentException

Methods public static java.lang.Object java.lang.reflect.Proxy.newProxyInstance(java.lang.ClassLoader,java.lang.Class[],java.lang.reflect.InvocationHandler) throws java.lang.IllegalArgumentException

Methods public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException

Methods public final void java.lang.Object.wait() throws java.lang.InterruptedException

Methods public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException

Methods public final native java.lang.Class java.lang.Object.getClass()

Methods public final native void java.lang.Object.notify()

Methods public final native void java.lang.Object.notifyAll()

Hello World

成功了,但是没想到我生成的这个类里面带了这么多方法,对着api挨个查查看吧。