关于java代理模式的疑问 真实对象什么时候被创建

作者&投稿:荤丽 (若有异议请与网页底部的电邮联系)
Java的对象实例是什么时候被创建~

是在new 的时候创建的,比如:
Person p = new Person();
此时对象实例被创建。

楼主您好,代理对象往往在真实方法实行抑或前抑或后抑或抛异常等时候做了一些“额外”的操作,这就是spring的aop原理实现,比如我需要调每个方法都要记录日志,那么我是不是整个系统里几百个方法里面没个之前都要加一句记录日志的方法呢?而用代理模式就可以我只关注我的业务,用代理类来帮我实现这个记录日志的方法

首先声明一点:尽管原对象和代理对象是"同一个类型",但是被代理的和原对象不是完全一样的对象,就好比说,原来的大厦叫河蟹大厦,现在我给大厦安装了电梯,但是他还叫河蟹大厦,我们代理之后的对象就是安了电梯的河蟹大厦,电梯没有用么?当然有用了,但是我们安装电梯后要不要使用原来河蟹大厦的功能比如,电灯呢?当然也要了!这就是代理之后和被代理之前的关系,代理当然是有用的啦!

当然你可能会说了:为什么不在设计之初就按上电梯呢?这个。。。很多时候我们是故意为之,当太多类似的函数的里面都需要同一条语句,并且位置都大致相似的时候,我们需要在每个函数里面都添加上么?一次两次还好,多次了你可能就会烦了。一句两句好,如果一下都是10几句,每个函数都一样的,就太“八股文”了。

下面是一个例子吧,算伪代码,只是想让你看看怎么用,不一定能直接运行。

proxy.newProxyInstance()生成的代理对象,是在传入InvocationHandler的对象基础之上“织入”的即改进的,所以你传入的这个对象必须new出来,要不然怎么对其进行改进呢?而一般来说,我们使用的是代理之后的类,而非原始类,代理之后的类可以对原始传入类的一些函数进行拓展,这就是动态代理的用途。

再具个例子吧。。。

我们有很多类,它们都执行不同的SQL语句来连接数据库。如果我们在每个类里面都在查询代码之前先连接数据库,之后关闭数据库连接,那会导致很多的代码重复,这时候如果我们利用代理就是这么一个效果。

public class MyHandler implements InvocationHandler
{
......被代理对象target传入,省略
.....
Object invoke(Object proxy,
Method method,
Object[] args)
{
..做链接数据库
Object obj = proxy.invoke(target,args);
..做关闭数据库
return obj;
}

}

然后执行的时候:
Query target = new Query();
Query advanceTarget = Proxy.newProxyInstance(target.getClass().getClassloader(),target.getClass().getInterfaces(),new MyHandler(target)) ;

上面的代码的意思能看懂吧?

Handler相当于一张标准网,他通过传入target,把它增强为能自动连接数据库,查询完毕后能关闭数据库。

Proxy new的时候,使用“这张网”来增强target,并返回增强之后的数据库,我们之后使用advancdTarget就可以无忧无虑的了!因为不用再考虑关闭数据库和打开数据库这些繁琐的细节了。

以上都是AOP的概念,如果有兴趣可以读读Spring框架的书就能更深刻的理解意思了。希望我写的你都能明白,呵呵。

=========================================================
上次的解答:
首先给你一段代码,其他的代码看完了解释。

// 抽象角色:
abstract public class Subject {
abstract public void request();
}

// 真实角色:实现了Subject的request()方法。
public class RealSubject extends Subject {
public RealSubject() {
}
public void request() {
System.out.println( " From real subject. " );
}
}

// 代理角色:
public class ProxySubject extends Subject {
private RealSubject realSubject; // 以真实角色作为代理角色的属性
public ProxySubject() {
}
public void request() { // 该方法封装了真实对象的request方法
preRequest();
if ( realSubject == null ) {
realSubject = new RealSubject();
}
realSubject.request(); // 此处执行真实对象的request方法
postRequest();
}
private void preRequest() {
// something you want to do before requesting
}
private void postRequest() {
// something you want to do after requesting
}
}

// 客户端调用:
Subject sub = new ProxySubject();
Sub.request();

开始解释,上面看到了,其实正如你说的,如果只是简单的为了Client调用原对象,大可不必这么费尽周折啊!

使用代理的意义是:
1、当某些对象不方便直接调用某对象的时候,多数情况是团队开发中,抽象出接口了,但是实现类还没有出来。所以就使用代理了
2、这种情况更有用:为了让被代理类加强功能,不知道你有没有使用过Spring、Struts等框架,这些框架中经常有“代理”、“织入”等AOP的概念,简单的说就是:你原来有一个人的类,只能吃饭,我现在通过代理,给这个人的类加上了喝水、说话的功能,代理的设计模式就实现了这种静态代理。
注意,这和包装等是不一样的。因为代理类和被代理类有相同的父接口。

以上都是我自己写的解释,水平有限,希望和你继续探讨~


Java代理的三种模式有什么?
代理模式是一种设计模式,简单说即是在不改变源码的情况下,实现对目标对象的功能扩展。比如有个歌手对象叫Singer,这个对象有一个唱歌方法叫sing()。假如你希望,通过你的某种方式生产出来的歌手对象,在唱歌前后还要想观众问好和答谢,也即对目标对象Singer的sing方法进行功能扩展。但是往往你又不能直接对...

Java 代理模式和装饰者模式的区别
您好!代理模式与装饰者模式看起来很像,都实现基础对象实现的接口,在其自身对象中都保存着对被代理\/被装饰者的对象引用。先来看看装饰者模式的定义:动态的将责任附加到被装饰者对象上,用于扩展对象的功能。比继承的灵活性大。典型的如Java IO的设计即是装饰者模式的典型应用。代理模式模式的定义:对...

Java程序性能优化-代理模式(5)
在Java中 动态代理类的生成主要涉及对ClassLoader的使用 这里以CGLIB为例 简要阐述动态类的加载过程 使用CGLIB生成动态代理 首先需要生成Enhancer类实例 并指定用于处理代理业务的回调类 在Enhancer create()方法中 会使用DefaultGeneratorStrategy Generate()方法生成动态代理类的字节码 并保存在byte数组中 ...

代理模式之Java动态代理
1. OverviewJava在java.lang.reflect包下,定义了自己的代理。利用这个包下的类,我们可以在运行时动态地创建一个代理类,实现一个或多个接口。并将方法的调用转发到你所指定的类。因为实际代理是在运行时创建的,所以称为:动态代理。Proxy:完全由java产生的,而且实现了完整的subject接口。InvocationHandl...

java的代理模式有何用,直接调用用实现类不就行了吗,干嘛多此一举呢...
使用代理类可以在实现类的基础上进行扩展,可以在方法中动态加入代码。这里要理解的是,实现类和代理类都是继承了同一个接口的(必须的)举个例子,如果你要通过一个实现类,将文本控件中输入的数字,做 加减乘除(也许还有很多运算) 法的运算,你发现这样会有一些问题存在,字符串如果不能转换成数字,...

java中常用到得设计模式有哪几种?
Java中的23种设计模式:Factory(工厂模式),Builder(建造模式),Factory Method(工厂方法模式),Prototype(原始模型模式),Singleton(单例模式),Facade(门面模式),Adapter(适配器模式),Bridge(桥梁模式), Composite(合成模式),Decorator(装饰模式), Flyweight(享元模式), Proxy(代理...

什么是代理模式?(java中的)
为其他对象提供一种代理以控制对这个对象的访问.代理是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,我们也许有代理服务器等概念,代理概念可以解释为:在出发点到目的地之间有一道中间层,意为代理.详细可参考java设计模式手册 ...

设计模式--代理模式
代理模式有三种形式:静态代理、动态代理(JDK代理和Cglib代理)和智能代理。静态代理需要共享接口或父类,而动态代理如JDK代理,无需接口约束,通过java.lang.reflect.Proxy的newProxyInstance方法在运行时创建。静态代理模式详解静态代理示例中,我们首先定义接口ITeacherDao,目标对象 TeacherDao实现该接口。接...

java中为什么要给类使用代理?它有哪些好处
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。代理模式一般涉及到的角色有:抽象角色:声明真实对象和代理对象的共同接口;代理角色:代理对象角色内部含有对真实对象的引用...

java 动态代理怎么理解
JAVA的静态代理与动态代理比较 一、概念代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务...

新都区17580404754: 关于java代理模式的疑问 真实对象什么时候被创建 -
琦支镇咳: 首先声明一点:尽管原对象和代理对象是"同一个类型",但是被代理的和原对象不是完全一样的对象,就好比说,原来的大厦叫河蟹大厦,现在我给大厦安装了电梯,但是他还叫河蟹大厦,我们代理之后的对象就是安了电梯的河蟹大厦,电梯...

新都区17580404754: java的代理模式有何用,直接调用用实现类不就行了吗,干嘛多此一举呢.... -
琦支镇咳: 使用代理类可以在实现类的基础上进行扩展,可以在方法中动态加入代码.这里要理解的是,实现类和代理类都是继承了同一个接口的(必须的)举个例子,如果你要通过一个实现类,将文本控件中输入的数字,做 加减乘除(也许还有很多运算...

新都区17580404754: 什么是JAVA代理模式,一直理解不了. -
琦支镇咳: 简单点说就是你要调用一个接口test(),这里面有一个”说话“的方法,当你实例化之后就可以调用这方法,但是你发现你不止要”说话“这个功能,你还要实现一个”吃饭“sing()的功能, 那么我们既不能在test接口里增加sing()方法,又不能在每个前端都增加sing方法,我们只有增加一个代理类talkProxy,这个代理类里实现talk和sing方法,然后在需要sing方法的客户端调用代理类即可.大概就是这个意思 全手打, 望采纳.

新都区17580404754: java设计模式之代理模式: -
琦支镇咳: 很简单:对外部提供统一的接口方法,而代理类在接口中实现对真实类的附加操作行为,从而可以在不影响外部调用情况下,进行系统扩展.也就是说,我要修改真实角色的操作的时候,尽量不要修改他,而是在外部在“包”一层进行附加行为...

新都区17580404754: Java静态代理和iOS代理模式这两个概念的理解上的疑惑 -
琦支镇咳: 看了JAVA版的设计模式的 代理模式 和IOS @protrol 比较,java 的看了都晕了.不完全一致,委托和代理 称呼上就好像反的.用JAVA 的中接口 在view中实现方法,就要把接口中所有的方法都复写一下,这个不太好用, 还不知道其它什么模式来实现像Ios @protrol 的功能.

新都区17580404754: Java代理的三种模式有什么? -
琦支镇咳: Java的三种代理模式简述本文着重讲述三种代理模式在java代码中如何写出,为保证文章的针对性,暂且不讨论底层实现原理,具体的原理将在下一篇文章中讲述.代理模式是什么代理模式是一种设计模式,简单说即是在不改变源码的情况...

新都区17580404754: java代理模式的简介 -
琦支镇咳: 代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用.代理模式的思想是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象.这些额外的操作通常需要与实际对象进行通信.

新都区17580404754: java静态代理和装饰模式的区别 -
琦支镇咳: 1. 装饰模式:以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案;2. 代理模式:给一个对象提供一个代理对象,并有代理对象来控制对原有对象的引用;3. 装饰模式应该为所装饰的对象增强功能;代理模式对代理的对象施加控制,并不提供对象本身的增强功能4. 二者的实现机制确实是一样的,可以看到他们的实例代码重复是很多的.但就语义上说,这两者的功能是相反的,模式的一个重要作用是简化其他程序员对你程序的理解,你在一个地方写装饰,大家就知道这是在增加功能,你写代理,大家就知道是在限制.

新都区17580404754: java动态代理是什么 -
琦支镇咳: JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务. 按照代理的创建时期,代理类可以分为两种. 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经存在了. 动态代理:在程序运行时,运用反射机制动态创建而成.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网