0

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

然后是下面的解释:

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

在 Bar.java 之后的示例中是接口 - 其对象将被插入。

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

预先感谢

4

1 回答 1

0

我相信您混合了两种创建代理的方式:CGLib 和运行时代理。第一个在加载您的类时创建代理,而第二个顾名思义是在运行时创建的。它们在某种程度上是相同的,它们都在您的对象周围创建透明代理,但它们之间存在一些显着差异。例如,CGlib 要求类是非最终的并且具有默认构造函数。或者让我们考虑以下示例。假设您有一项服务MyService

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

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

假设您需要proxifiedMethod在事务中运行,并提示您与@Transactional注释一起使用的框架。如果框架(比方说 Spring)被配置为使用运行时代理,则不会创建proxifiedMethod从中调用的事务,在 CGLib 的情况下它会创建。pureMethod

回答您的问题:

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

  2. 当涉及诸如事务或安全性等横切关注点时,您所指的运行时代理在 Java 企业世界中被广泛使用。通常你不想用手动事务管理来弄乱你的代码,这是由像 Spring 这样的框架甚至像 JBoss 这样的应用程序容器来完成的。因此,您添加了一些元信息,例如@Transactional注释,框架会围绕您的注释服务创建一个代理来处理那里的事务管理逻辑。

于 2012-04-08T06:46:35.163 回答