太阳解释插入

时间:2012-04-08 05:37:09

标签: java proxy

请参阅http://java.sun.com/developer/technicalArticles/JavaLP/Interposing/

然后是以下解释:

  

在类加载时,必须在之前找到插入的类   原始的...插入的类必须具有相同的全名   原本的。例如,类foo可能存在于包pub.foo中   并从包pub.bar创建类Bar的实例。创建一个   将bar.java文件放在另一个目录中,例如假/ pub / bar和   在类路径前加/假,确保JVM加载我们的   类pub.bar.Bar的定义而不是原始的。通过这种方式,   我们可以将Bar的方法定义介于原文之上。

在下面的示例中,Bar.java是接口 - 其对象将插入其中。

我无法理解Sun在上面的引文中解释的用例。具体疑虑: 1.提到的原始课程是哪一个? 2.在什么情况下我需要拥有自己的假/ pub.bar.Bar而不使用原始的(如果我已正确解释原文的含义)。如果可能,请举例说明。

谢谢你的推荐

1 个答案:

答案 0 :(得分:0)

我相信你正在混淆两种代理创建方式:CGLib和运行时代理。第一个在您的类加载时创建代理,第二个在名称中表示在运行时执行。它们是相同的,它们都在对象周围创建透明代理,但它们之间存在一些显着差异。例如,CGlib要求一个类是非final的,并且具有默认构造函数。或者让我们考虑以下示例。假设您有服务MyService

public class MyService {
    @Transactional
    public void proxifiedMethod(){
         // some logic here    
    }

    public void pureMethod(){
        // some logic here...
        proxifiedMethod();
        // ...and here
    }
}

假设您需要proxifiedMethod在事务中运行,并提示您使用@Transactional注释的框架。如果框架(假设是Spring)被设置为使用运行时代理,那么将不会创建从proxifiedMethod调用的pureMethod的事务,如果是CGLib,它将会创建。

回答你的问题:

  1. 原始类是围绕创建代理对象的实例的类。

  2. 当涉及到事务或安全性等cross-cutting concerns时,您所指的运行时代理在Java企业世界中被广泛使用。通常,您不希望使用手动事务管理来破坏您的代码,这是由像Spring这样的框架甚至像JBoss这样的应用程序容器完成的。因此,您添加了一些元信息,如@Transactional注释,框架会在您带注释的服务周围创建一个代理,以处理那里的事务管理逻辑。