理解动态代理的实现过程

我在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("Hello World");

       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挨个查查看吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值