求java一年精通android大神动态代理的大神帮忙

java 我不理解动态代理的意义_百度知道
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 来解决的。你的代码没有为此作出任何改变但新功能添加上来了。
提问者评价
真的好谢谢你,你几句话我就明白了
来自团队:
其他类似问题
为您推荐:
其他2条回答
  首先你要明白&代理模式&&  按照代理的创建时期,代理类可以分为两种:静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。动态代理:在程序运行时,运用反射机制动态创建而成。  动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java&反射机制可以生成任意类型的动态代理类。java.lang.reflect&包中的Proxy类和InvocationHandler&接口提供了生成动态代理类的能力。&spring的动态代理是用cglib工具包,它实际是操作字节码完成的代理
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。代理模式一般涉及到三个角色:抽象角色:声明真实对象和代理对象的共同接口;代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
java的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁java动态代理有什么作用_百度知道
java动态代理有什么作用
作用非常大,在很多底层框架中都会用得到,比如struts,Spring等都用到了动态代理,它的作用很简单,就是将你要使用的类,重新生成一个子类或本类,这样框架就可以利用这个新生成的类做一些事情,比如在该类的方法前后加一些代码。。这样的话,你想像一下,你是不是不用修改任何已经编写好的代码,只要使用代理就可以灵活的加入任何东西,将来不喜欢了,不用也不会影响原来的代码。
其他类似问题
为您推荐:
面向切面编程的时候有些用
java的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁Java 动态代理作用是什么?
按投票排序
主要用来做方法的增强,让你可以在不修改源码的情况下,增强一些方法,在方法执行前后做任何你想做的事情(甚至根本不去执行这个方法),因为在InvocationHandler的invoke方法中,你可以直接获取正在调用方法对应的Method对象,具体应用的话,比如可以添加调用日志,做事务控制等。还有一个有趣的作用是可以用作远程调用,比如现在有Java接口,这个接口的实现部署在其它服务器上,在编写客户端代码的时候,没办法直接调用接口方法,因为接口是不能直接生成对象的,这个时候就可以考虑代理模式(动态代理)了,通过Proxy.newProxyInstance代理一个该接口对应的InvocationHandler对象,然后在InvocationHandler的invoke方法内封装通讯细节就可以了。具体的应用,最经典的当然是Java标准库的RMI,其它比如hessian,各种webservice框架中的远程调用,大致都是这么实现的。
补充一下。动态代理是JAVA的一大特性。动态代理的优势就是实现无侵入式的代码扩展。目前动态代理主要分为JAVA自己提供的动态代理和CGLIB类似框架。JAVA自带的动态代理是需要接口的。CGLIB这种则是直接修改字节码。
最近正好在看,特来挖坟。关于动态代理设计模式很可能题主就在不知不觉中使用了,例如Spring中的AOP,Struts2中的拦截器等。先来看静态代理模式代码:package test;
public interface Subject
public void doSomething();
package test;
public class RealSubject implements Subject
public void doSomething()
System.out.println( "call doSomething()" );
package test;
public class SubjectProxy implements Subject
Subject subimpl = new RealSubject();
public void doSomething()
subimpl.doSomething();
package test;
public class TestProxy
public static void main(String args[])
Subject sub = new SubjectProxy();
sub.doSomething();
刚开始我会觉得SubjectProxy定义出来纯属多余,直接实例化实现类完成操作不就结了吗?后来随着业务庞大,你就会知道,实现proxy类对真实类的封装对于粒度的控制有着重要的意义。但是静态代理这个模式本身有个大问题,如果类方法数量越来越多的时候,代理类的代码量是十分庞大的。所以引入动态代理来解决此类问题。先看代码:
public interface Subject
public void doSomething();
package test;
public class RealSubject implements Subject
public void doSomething()
System.out.println( "call doSomething()" );
package test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyHandler implements InvocationHandler
private Object tar;
//绑定委托对象,并返回代理类
public Object bind(Object tar)
this.tar = tar;
//绑定该类实现的所有接口,取得代理类
return Proxy.newProxyInstance(tar.getClass().getClassLoader(),
tar.getClass().getInterfaces(),
public Object invoke(Object proxy , Method method , Object[] args)throws Throwable
Object result = null;
//这里就可以进行所谓的AOP编程了
//在调用具体函数方法前,执行功能处理
result = method.invoke(tar,args);
//在调用具体函数方法后,执行功能处理
return result;
public class TestProxy
public static void main(String args[])
ProxyHandler proxy = new ProxyHandler();
//绑定该类实现的所有接口
Subject sub = (Subject) proxy.bind(new RealSubject());
sub.doSomething();
看完代码,现在我来回答,动态代理的作用是什么:Proxy类的代码量被固定下来,不会因为业务的逐渐庞大而庞大;可以实现AOP编程,实际上静态代理也可以实现,总的来说,AOP可以算作是代理模式的一个典型应用;解耦,通过参数就可以判断真实类,不需要事先实例化,更加灵活多变。欢迎补充。}

我要回帖

更多关于 求大神帮忙ps一下 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信