java - 如何访问位于字符串中定义的包中的静态类?

标签 java plugins jar

澄清一下:我正在为我的应用程序编写一个插件框架。我的应用程序和插件都是 jar 文件。目前,我使用脚本将插件文件合并到应用程序 jar 中,插件最终位于包中:com.crimson.server.plugins。我需要能够访问插件文件,但我无法执行硬编码包。例如:com.crimson.server.plugins.nst.Plugin。我唯一能想到的另一件事是将插件保留为 jar 并以某种方式加载它们。这怎么能做到呢?

最佳答案

您可以使用reflection API 。它用于描述能够检查同一系统(或自身)中其他代码的代码。

下面是如何从字符串创建类实例的示例。

import com.stakoverflow.plugin.MyPluginClass;

public class Main {

    public static void main(String[] args) {
        String myclass = "com.stakoverflow.plugin.MyPluginClass";
        try {
            Class clazz = Class.forName(myclass);

                MyPluginClass myPlugin = (MyPluginClass) clazz.newInstance();
                myPlugin.helloWorld();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

这是 MyPluginClass 的定义:

package com.stakoverflow.plugin;

public class MyPluginClass {

    public void helloWorld() {
        System.out.println("Hello world!");
    }
}

当然,在此示例中,您的类必须位于类路径中。否则类加载器将无法找到它。但动态加载 jar 是可能的。

关于java - 如何访问位于字符串中定义的包中的静态类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23846325/

相关文章:

java - Hadoop Map任务/Map对象

java - 如何在 Eclipse 中更新 JRE

php - 插件无法激活,因为它触发了 fatal error : unexpected 'require_once'

java - 使用外部 jar 运行编译的程序时出错

java - 使用 Scanner 从打包的 jar 中读取大文件作为资源时出现 NullPointer

java - 如何在 Java 应用程序之间共享 .jar 文件

java - 输出错误: Binary Search Tree implementation using Java

java - Math rand 的这种改组是如何进行的?

用于可扩展处理程序/插件架构的 Ruby 结构

jQuery - 插件中带有 $(this) 的 setTimeout 函数