A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李深山 中级黑马   /  2012-3-19 09:37  /  2662 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

关于动态代理,我看了半天很疑惑,不知道说的什么东西?具体怎么用?该如何用?这么用的目的是什么?
望理解了的高手帮我说说看。

4 个回复

倒序浏览
所谓代理,就是需要代理类和被代理类有相同的对外接口或者说成服务,所以代理类一般都必须实现了所有被代理类已实现的接口,因为接口就是制定了一系列对外服务的标准
动态态代理有这样灵活的特性,所以我们在设计动态代理类(DynamicProxy)时不用显式地让它实现与真实主题类(RealSubject)相同的接口(interface),而是把这种实现推迟到运行时。
为了能让DynamicProxy类能够在运行时才去实现RealSubject类已实现的一系列接口并执行接口中相关的方法操作,需要让DynamicProxy类实现JDK自带的java.lang.reflect.InvocationHandler接口,该接口中的invoke()方法能够让DynamicProxy实例在运行时调用被代理类的“对外服务”,即调用被代理类需要对外实现的所有接口中的方法,也就是完成对真实方法的调用,Java帮助文档中称这些真实方法为处理程序。
我们肯定必须先把被代理类RealSubject已实现的所有interface都加载到JVM中,不然JVM怎么能够找到这些方法呢?
动态代理模式可以使得我们在不改变原来已有的代码结构的情况下,对原来的“真实方法”进行扩展、增强其功能,并且可以达到控制被代理对象的行为的目的
回复 使用道具 举报
    动态代理:在程序运行时,运用反射机制动态创建而成。  
    动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。
回复 使用道具 举报
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;


public class TestProxy {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                TestModel tm=new TestModel();
                TestProxy1 tp=new TestProxy1(tm);
                Class<?> c=tp.getClass();
               
                TestInterFace tif=(TestInterFace)Proxy.newProxyInstance(c.getClassLoader(),tm.getClass().getInterfaces(),tp);
            tif.add();
        }

}
class TestProxy1 implements InvocationHandler
{
        private Object o;
   
        public TestProxy1(Object o) {
               
                this.o = o;
        }

        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
                        throws Throwable {
                method.invoke(o, args);
                return null;
        }
       
}
class TestModel implements TestInterFace
{
        public void add()
        {
                System.out.println("hello");
        }
}
interface TestInterFace
{
        public void add();
}
回复 使用道具 举报
毕老师视频里有代理方面的内容吗
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马