我已阅读文档,但我仍然不明白应该提供哪个类加载器作为参数。我尝试了几个选项,但这似乎对编译或代理的行为没有影响。我有点不安,我可以通过任何类加载器参数传递任何东西,包括null
,并且代码仍然正常工作。任何人都可以解释这一点,并告诉我,如果我为类加载器提供了一个错误的参数,会出现什么样的错误?我应该补充一点,就Java或一般来说,我并没有对类加载器的强大直观概念。我应该向Proxy.newProxyInstance(...)提供哪个ClassLoader?
9
A
回答
6
任何类都需要有一个类加载器,因此我们必须在这里给出一个。
的重要组成部分,这是(在the documentation for getProxyClass()
):
所有接口类型都必须通过指定的类加载器是按名称可见。换句话说, 的类加载器CL和每一个接口I,下面的表达式必须为真:
Class.forName(i.getName(), false, cl) == i
所以,你可以使用任何类加载器,其中它的父类加载器的一个(或多个)定义的给定接口。
如果null
适用于你的情况,我想你的接口也有null
类加载器(引导加载程序) - 那么你使用哪个类加载器应该没有关系。如果你必须从你不知道的接口创建一个代理,只需要给出第一个接口的类加载器,并希望你的调用者不会做一些奇怪的事情。
为什么需要它?
你可以把它想象这样的:
- 的
getProxyClass()
方法创建(如果不存在的话)实现所有接口的所有方法的新类的一些字节码(每个人只是转发致电InvocationHandler
)。 - 然后它将这个字节码传递给您指定的类加载器的
defineClass
方法。 - 在此字节码中,您的所有接口都按名称引用,现在VM使用引用的
forName
调用来解析这些接口。
我们可以用纯Java已经实现了这个getProxyClass
这种方式没有任何VM魔法,但我们需要创建一个新的类加载器(与指定一个作为家长),因为它不是能够重新使用现有的一。
在现实中可能不存在此合成类实际字节码,因为虚拟机能够在这里使用其内部的魔法:-)
相关问题
- 1. 我应该使用哪个EJB 3 persisent提供程序?
- 2. 我应该向我的TFSBuild帐户提供哪些帐户权限?
- 3. 我应该去哪个方向计算
- 4. 我应该使用哪些标头来提供静态内容?
- 5. 从EclipseLink向哪个提供者提供JPA?
- 6. OpenID提供商向消费者提供哪些个人信息?
- 7. 请告诉我,我应该向我的应用程序提供哪种浏览器兼容性?
- 8. 我应该向glTexSubImage2D提供完整或部分图像吗?
- 9. Perl:我应该向delcampe API提供什么样的数据?
- 10. 我应该在向RNN提供句子时删除停用词
- 11. 我应该如何为DocuSign提供PDF?
- 12. cvPerspectiveTransform:我应该提供什么?
- 13. 我应该如何注入提供者?
- 14. Cordova 5.0.0:我应该向git提交哪些文件?
- 15. ClassLoader [com.bea.wls.redef.RedefiningClassLoader]没有提供'addTransformer(ClassFileTransformer)'方法
- 16. iBeacon应该提供一个AlertView
- 17. 玩家应该旋转哪个方向?
- 18. 我应该为@Autowired提供一个setter吗?
- 19. 我应该为ElasticSearch提供多少个旧索引?
- 20. 我应该在哪里使用CSS供应商前缀
- 21. webapp应该提供哪种视频格式?
- 22. 我该如何让rpm知道里面提供了哪些库?
- 23. 在使用黄瓜时,我们应该在哪里提供RestAPI细节?
- 24. ClassLoader应该是线程安全的吗?
- 25. 为什么Dagger2要求我提供组件不应该提供的东西?
- 26. 我应该在URL中提供父资源名还是不提供RESTful WS?
- 27. Dist :: Zilla插件应该如何向用户提供反馈?
- 28. 应该从客户端向OAuth提供商发送什么
- 29. 我什么时候应该关闭,我提供给ListView控件
- 30. 该程序链接到哪个库提供给定的功能?
谢谢,我仍然没有什么类加载器做的直觉。你能提一点关于这个吗?我仍然很难理解为什么一个null类加载器可能会工作,如果类加载器负责做任何实质性的事情。也许一个玩具的例子给出了错误的类加载器? – jonderry 2011-03-30 01:24:34
'null'类加载器是“引导类加载器”,加载核心类的类加载器(比如'Class','Object','ClassLoader')。它由VM本地实现,并没有ClassLoader对象。 (它被Class使用。例如,如果你给'null'作为'ClassLoader'参数)。 (例子会晚点来。) – 2011-03-30 11:21:47