Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在自主计算领域,以下Java代码如何有用?_Java_Classloader - Fatal编程技术网

在自主计算领域,以下Java代码如何有用?

在自主计算领域,以下Java代码如何有用?,java,classloader,Java,Classloader,在我正在学习的一本书中,他们展示了以下Java代码: Class c = ClassLoader.getSystemClassLoader().loadClass(name); Class type = this.getClass().getClassLoader().loadClass(name); Object obj = type.newInstance(); 此代码用于动态加载Java类。书中写道: 卸载模块会引发一个问题。类加载器无法卸载 班级。卸载类需要卸载类加载器本身。 这就是为

在我正在学习的一本书中,他们展示了以下Java代码:

Class c = ClassLoader.getSystemClassLoader().loadClass(name);
Class type = this.getClass().getClassLoader().loadClass(name);
Object obj = type.newInstance();
此代码用于动态加载Java类。书中写道:

卸载模块会引发一个问题。类加载器无法卸载 班级。卸载类需要卸载类加载器本身。 这就是为什么程序员。。倾向于定义几个类装入器

使用这样的代码有什么好处?自主计算的概念通常是“自主系统管理”。这与Java程序如何受JVM控制有什么关系


资料来源:《自主计算原理设计》(Lalanda著)第166页。好处在于,您可以在运行时决定实际加载和使用的类。对于一个类只有一个实现的简单Java程序,没有任何好处

像Osgi(Eclipse的基础)这样的复杂环境为每个模块使用单独的类加载器。这带来了灵活性和在运行时替换模块的可能性

另一个“经典”用例是在运行时加载数据库驱动程序。您可能希望连接到MySQL数据库或Oracle,并且两者都使用不同的JDBCDriver实现

添加:

Alex Blewitt的一篇非常好的文章讨论了eclipse/osgi类加载的概念

在我自己的编码经验中,我将eclipse插件用于企业级web监控项目。监控基本上涉及不断地在网络上刮取一些资源。每个这样的资源都由一个监控插件的实现来监控。并非所有的资源都由我们控制,所以当它们发生变化时,我们必须调整处理该资源的插件。整个监控应用程序可以继续运行,同时我们将旧插件模块卸载到新插件模块上。所有这些都是在运行时进行的,几乎没有停机时间(只针对需要交换的模块)。当然,我对每个插件的类加载器的使用是通过使用EclipseRichClient平台(RCP)隐式实现的。您只需要指定哪个插件依赖于哪个插件,然后实际的类加载由RCP平台完成

像Tomcat这样的Web服务器使用相同的方法,尽管我对Tomcat没有太多经验

直接实现动态类加载系统可能是一个很好的练习,但对于真实世界的应用程序,我将明确地研究生产级实现,如或

如果你想把整个事情向前推进一步,并且需要在集群中运行插件,你可能需要研究一下

我不能在这里分享我的代码,但以下是一些优秀的代码示例起点:


    • 假设以下示例。你开发一个程序。用户可以为它编写一些插件(或自治程序上下文中的代理)。您的程序将加载配置变量中定义的所有插件(或自定义代理类),如:

      plugins: foo.bar.myplug,another.plugin
      
      在这种情况下,需要动态加载属性中枚举的类。这些类在开发主程序时是未知的,不能使用正常的类加载

      此外,如果出于任何原因您想要卸载这些类(例如,在重新读取配置之后),您将需要一个自定义类加载器

      附录

      例如,我们可以想象一个程序有一个“世界”,其中一些“代理”相互作用。除了主程序中包含的几个代理之外,用户还可以创建自己的代理

      主程序将负责代理之间的交互(世界规则):向代理发送事件;更新考虑到代理人行动的世界状况;保存,加载世界

      每个代理都是一个Java类,必须包含一个由主程序调用的方法“public Action handleEvent(Event)”。默认情况下,存在一些预定义的类,如“Person.class”、“SearchRobot.class”,每个类都有自己的“handleEvent”实现。它们都扩展了抽象类“Agent”

      该程序允许用户创建自己的代理。用户必须创建一个包含方法“handleEvent”的新类(扩展代理)。以一个用户类“WalkerAgent.class”为例,它有一条穿越世界的启发式短路径

      主程序还有一个名为“插件”的属性。此属性必须包含用户代理的列表:

      plugins: foo.bar.WalkerAgent 
      
      当主程序启动时,它应该加载“plugins”属性中枚举的所有类。类似于(伪代码):

      为了创建“WalkerAgent”类代理的新实例,您不能在主程序中编写“new WalkerAgent()”,因为编写主程序时该类不存在。相反,您必须调用“loadClass”返回的类的“newInstance()”

      现在,代理“WalkerAgent”已准备好以预定义代理“Person”和“RobotSearch”相同的方式使用


      (PS:很明显,在自主计算中,举例来说,世界是一个网络描述,代理执行诸如“监控IP”、“路由优化器”之类的操作……这个例子使用了更容易理解的概念)

      好的,这很有趣。有点像对实际类的继承(也许我们可以在语言应用程序中使用,根据用户pref加载法语应用程序或西班牙语应用程序)。奇怪的是,你有没有使用过这种类型的代码(
      getSystemClassLoader().loadClass(name)
      )是的,作为编程Eclipse富客户端平台应用程序的一部分。这真是太好了。我会看看我是否可以运行一个简单的演示,谢谢!那么,您所处理的代码(即Eclipse富客户机平台)是什么样子的呢?我很好奇它是如何编码的。当需要加载同一类的两个版本时,这类东西被证明是有用的。关于这一点的文章载于。这个问题已经解决了
       read property "plugins" and split it by ","
       for each split in previous:
          call loadClass