如何使用通过不同的Java类加载器加载的实现?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何使用通过不同的Java类加载器加载的实现?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2019字,纯文字阅读大概需要3分钟。
内容图文
![如何使用通过不同的Java类加载器加载的实现?](/upload/InfoBanner/zyjiaocheng/688/f56e553daff2401182a7fccbda7fb186.jpg)
我正在编写一个库,允许人们使用插件框架(如果您熟悉的是JPF)来提供某些接口的实现.插件未存储在类路径中.该框架为每个插件提供了一个ClassLoader,因此当请求接口“ MyInterface”的名为“ MyImpl”的实现时,我可以找到正确的插件,然后使用该插件的ClassLoader加载类,从中可以创建一个实例如果我对构造函数有所了解.到现在为止还挺好.
但是,现在我需要调用一个仅在该特定实现上可用的方法.因此,有两种方法可以尝试执行此操作:
方法1:
// Makes sure that MyImpl has been loaded, using the custom classloader
Plugins.getClass(MyInterface.class, "MyImpl");
// This line will not compile because MyImpl is not available at build time
MyImpl foo = new MyImpl();
// If I could get this far, this line would work:
foo.methodOnlyInMyImpl();
方法2:
// This call will get an instance of MyImpl (already written and tested)
MyInterface foo = Plugins.getInstance(MyInterface.class, "MyImpl");
// Compiler error because there is no MyInterface.methodOnlyInMyImpl method.
foo.methodOnlyInMyImpl()
方法1是两者的清除器,因为它与类“正常”且无法通过插件访问时编写代码的方式最为相似.但是,都无法编译.
到目前为止,我已经提出的选项:
A.使用方法2,但是使用反射来执行methodOnlyInMyImpl方法调用(请不要!)
B.将插件类放在构建路径中,然后使用方法1进行编译. (我目前的最爱)
C. B在安装插件时,将类文件复制到类路径中的另一个目录中,以便系统类加载器可以加载它们(导致其他问题)
因此,我的问题是:
>我是否想念另一个更好的主意?
>如果我做B,我在运行时会遇到问题吗?毕竟,使用MyImpl的类可能已经使用系统类加载器加载了.因此,一旦看到MyImpl foo,它将不会尝试使用系统类加载器加载MyImpl,这将失败(即使Plugins.newInstance调用将提供MyImpl的实例)?
解决方法:
首先,当您需要针对实际实现进行实施时,从插件机制中获得什么优势?该插件应实现一个接口,您可以通过该接口使用该实现.
我对JPF不满意,但是当由不同的类加载器加载Java类时,它们永远不会兼容.但是有两种可能的方法:
>接口在您的类加载器中,插件类加载器将您的类加载器作为父类,因此其接口与您的相同.当在接口中声明方法时,代码2应该与此一起工作.
>您可以使用序列化.这是在独立的类加载器之间传输数据对象的一种更有用的有限方式.我需要使用它在两个webapp之间使用带有请求参数的跨上下文调度.
内容总结
以上是互联网集市为您收集整理的如何使用通过不同的Java类加载器加载的实现?全部内容,希望文章能够帮你解决如何使用通过不同的Java类加载器加载的实现?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。