黑马程序员技术交流社区

标题: 动态代理 [打印本页]

作者: 山水游客    时间: 2012-7-19 17:06
标题: 动态代理
Class clazzProxy1 = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
                System.out.println(clazzProxy1.getName());
上面的Proxy是什么意思,它是个类还是一个对象啊,如果是一个类获取字节码class不应该是类名.class么?张老师在视频中用到proxy是随意找的一个类还是,这个类就是专门用在动态代理上的。如果是用在动态代理上的。它是怎么使用的呢?
作者: 周玉龙    时间: 2012-7-19 17:47
你所说的那个视频我还没看到过,但是通过查找API我发现了public static Class<?> getProxyClass(ClassLoader loader, Class<?>... interfaces)这个方法。
它是java.lang.reflect.Proxy类下面的一个静态方法,会抛异常 throws IllegalArgumentException。他返回的是一个Class对象。参数:
loader - 定义代理类的类加载器interfaces - 代理类要实现的接口列表 返回:用指定的类加载器定义的代理类,它可以实现指定的接口
JDK动态代理的原理是根据定义好的规则,用传入的接口创建一个新类,这就是为什么采用动态代理时为什么只能用接口引用指向代理,而不能用传入的类引用执行动态类。


                             


















作者: 黑马-王言龙    时间: 2012-7-19 18:13
上面的Proxy是什么意思,它是个类还是一个对象啊?
Proxyj反射包中的一个类
如果是一个类获取字节码class不应该是类名.class么?
className.class这是获取名为className的类的字节码;而Proxy.getProxyClass()方法是获取其方法参数里的指定类型的字节码。这两个不一样。如果Proxy.class这是获取Proxy这个类本身的字节码
如果是用在动态代理上的。它是怎么使用的呢?
[这个详细张孝祥老师的代理视频,看懂就明白了。大致用法是这样的:用指定的类或接口动态生成代理类,拿这个代理类给目标添加一些系统功能,如加日期、日志、异常处理等color]
作者: 石好强    时间: 2012-7-20 15:28
Proxy是一个类,而起你可以看做是一个工具类,专门为创建动态代理而存在的。所属包:java.lang.reflect
最主要方法有两个:
解说:
① Proxy.getProxyClass(<1>参数是指定的类加载器对象  ,  <2>参数是目标类也就是需要创建代理类的对象所实现的接口列表);
   //这个方法是为一个类创建动态代理类的Class实例对象,得到代理类的Class实例对象,那么学过反射肯定知道怎么创建实体对象了,但是,这只是创建了一个代理类,
  //没有任何作用,因为没有绑定目标对象,绑定目标对象,有invocationHandler的代理类才是起作用的代理类。这个方法不常用,下面一个方法更重要

② Proxy.newProxyInstance(<1>参数指定的类加载器对象-->一般是从目标类的接口上获取 , <2>参数是目标类所实现的接口的Class对象列表  ,<3> 绑定目标处理程序--->InvocationHandler--这才是重点-InvacationHandler中通过反射获取目标类的方法并调用--而且可以在调用前后加系统功能代码--这才是真正的代理类形成了 );
//这个方法直接返回一个已经可以起作用的代理类对象,而增加的处理代码,则是在第三个参数InvocationHandler中。可以说代理的重点是InvocationHandler目标处理程序,
//而Proxy的方法,只是一个形式,你记住查API用法就可以了。理解了InvocationHandler代理也就明白了

//具体原方法可以查 java.lang.reflect.Proxy类,我上面只是对这类生成代理类的方法及其参数进行了解释,打开API一对照就明白了。代理的重点在InvocationHandler。







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2