【问题标题】:Dynamic external class loading动态外部类加载
【发布时间】:2013-01-25 17:01:40
【问题描述】:

我试图在 Java 中获得动态类加载的经验。因此,欢迎任何 cmets 和帮助。我有一个程序允许用户选择一个文件并对其执行一些操作。动作是“命令”,这些是我尝试加载的类。

它的工作方式是:用户将 .class 文件放入所需的文件夹,我的程序检查文件夹中的文件,如果 .class 文件中有类,它会加载它。

我做到了,但不是我想要的。目前,它仅适用于使用我的程序编译的类。但我想要的是我可以将任何包含类的 .class 文件放在文件夹中,然后我的程序会加载它。这是我现在的代码:

for (int i = 0; i < fileList.length; i++) {
    if (fileList[i].endsWith(".class")) {
        /////MY FIRT TRY/////ClassLoader myClassLoader = ClassLoader.getSystemClassLoader();
        ClassLoader classLoader = FileMod.class.getClassLoader();

        // Define a class to be loaded.
        String classNameToBeLoaded = fileList[i].replace(".class", "");

        // Load the class
        try {
            /////MY FIRST TRY/////Class myClass = myClassLoader.loadClass(classNameToBeLoaded);
            //if the class exists in the file
            Class aClass = classLoader.loadClass(classNameToBeLoaded);
            classList.add(aClass);
            System.out.println("CLASS FOUND : " + classNameToBeLoaded + aClass.getSuperclass());
        } catch (ClassNotFoundException e) {
            System.out.println("CLASS NOT FOUND : " + classNameToBeLoaded);
            continue;
        }
    }
}

如您所见,我尝试了两种方法,第一种目前在 cmets 中。我所做的是检查文件夹中的每个文件并检查它是否是 .class 文件,如果是,我会尝试加载该类(如果有的话)。我猜这两个classLoaders只能加载他们“知道”的文件,那我怎么能加载一个外部类呢。

【问题讨论】:

标签: java dynamic-class-loaders dynamic-class


【解决方案1】:

您通常需要一个新的类加载器。使用java.net.URLClassLoader.newInstance。不过要小心,您现在正在将类从外部加载到您的应用程序中。

(一些类加载器允许您添加位置,但这是一个真正的 hack。)

【讨论】:

  • 这正是我想要加载外面的类,谢谢我会试试的
  • 我可以使用 ClassLoader 还是更喜欢使用 URLClassLoader?为什么简单地说。
  • @castors33 使用URLClassLoader.newInstance 增加了各种额外的功能和检查,并且应该足够容易使用。也适用于不受信任的代码。 ClassLoader 的类层次结构有点乱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 2020-06-22
  • 2014-02-27
  • 1970-01-01
相关资源
最近更新 更多