请参阅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而不使用原始的(如果我已正确解释原文的含义)。如果可能,请举例说明。
谢谢你的推荐
答案 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,它将会创建。
回答你的问题:
原始类是围绕创建代理对象的实例的类。
当涉及到事务或安全性等cross-cutting concerns时,您所指的运行时代理在Java企业世界中被广泛使用。通常,您不希望使用手动事务管理来破坏您的代码,这是由像Spring这样的框架甚至像JBoss这样的应用程序容器完成的。因此,您添加了一些元信息,如@Transactional
注释,框架会在您带注释的服务周围创建一个代理,以处理那里的事务管理逻辑。