java 我不理解动态代理的意义

如果不能动态代理,那么情况会怎么样,能不能举个例子,我不知道动态代理哪里好。

人家是动态编程,需要在原来的方法的功能基础上再添加一些功能,而不用改变这个方法的签名,原来调用这个方法的类依然能正常工作。

比如,现在要把一段文本发送给另一个人,普通方法是 void send(File a),现在我们弄出个特性,就像 Spring AOP 那样,在 send 之前给这个 a 压缩一下。原来的程序没有压缩功能,现在我们需要添加的话而不改变原来所有的代码的话就得用类似 AOP 这样的代码来处理。

一般一个无法再继承的类和方法,要用代理,而能够继承的类和方法可以在内在中直接生成一个新的 java 类继承它然后覆盖掉那个 send 方法,像 hibernate/spring/jboss 都把这些自动完成了。
而像 AspectJ 这种 AOP 刚不同,它直接把人家的 class 代码修改了,它就不需要使用代理。

这些在新的 JDK 6 中都可以通过 Instrument 来做到,不过也是个通用的方法,还得通过规则来定制什么情况下处理,什么时候不处理。追问

我刚接触不太懂aop,aop是不是把原来的东西,添加一些功能而不改变原来的东西,我google了一下aop感觉像是给主体加附加功能(不影响主体),对吗?

追答

对,在不需要原来的作者明确改动代码的情况下添加新功能。比如你没有原来的代码但想添加新功能,或者你需要的新功能仅用于某个地方而原来的功能用到更多的地方,所以不打算修改原来的功能而只是定制你新加的这部分,那么使用 AOP 原来的代码不需要修改,你只需要配置 AOP 并新增你自己的功能,重新编译一下就好了。你听说过 Hibernate Lazy Initialization 吧,这叫延迟加载,也就是当一个对象有很多 detail 表时,以前自动把 detail 表的数据全抓取了导致这些对象可能没有被使用而浪费时间或浪费内存,于是懒加载的想法出现了,为了让懒加载对用户编程来说是透明的,你不需要明确的写代码实现它,Hibernate 是使用 AOP 来解决的。你的代码没有为此作出任何改变但新功能添加上来了。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-11-07

  首先你要明白"代理模式 "

  按照代理的创建时期,代理类可以分为两种:

    静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。

    动态代理:在程序运行时,运用反射机制动态创建而成。

  动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展

性,因为Java 反射机制可以生成任意类型的动态代理类。java.lang.reflect 

包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。 

spring的动态代理是用cglib工具包,它实际是操作字节码完成的代理

第2个回答  2018-09-17
理解动态代理的核心:
Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)

这个方法即是通过Java的反射机制动态地生成了代理类。通过传入的InvocationHandler来调用了被代理对象的方法。
然后是你说的意义。在编程中我们希望自己的代码是灵活的而不是死板的,能动态配置的东西就不要写死。这样来提高程序的可扩展性。如果不使用代理模式,将来我们想在当前的业务逻辑下添加一些其他的处理,比如日志、校验等等,就不得不侵入原有的业务代码。而这些操作其实和真正的业务无关,我们不想它们侵入业务代码。这时候就需要使用代理模式登场了。我们通过代理来调用原有的业务代码,又可以在业务逻辑之前和之后添加一些其他的逻辑。
个人理解。
第3个回答  2019-11-10
理解下代理这个词,代理人其实就是中介,中介就是帮买方和卖方的中间人,我们正常上班不影响我们工作,所有事情由中介去协调去跑腿。
第一个好处就是解耦,避免了买卖双方频繁见面和沟通协调,都交给中介干了。
第二个好处是增强,在不改变买卖双方意愿的同时,中介那里可以赚一些差价(例如卖方意愿卖10万块,买方准备花12万去买,中介没有改变双方意愿,自己中间稳赚2万块,这2万就是增强代码)。
java中也是一样,通过代理给代码之间解耦了(避免直接依赖一方有错另一方也跟着报错),同时在不改变目标对象和被代理对象的同时,在代理的代码中进行增强,加业务逻辑。
第4个回答  2012-10-31
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式一般涉及到三个角色:
抽象角色:声明真实对象和代理对象的共同接口;
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
相似回答