【问题标题】:Is there any way to load all classes in a specific path without knowing their package names?有没有办法在不知道包名的情况下加载特定路径中的所有类?
【发布时间】:2015-10-11 19:30:53
【问题描述】:

我正在编写一个对文本文件执行某些操作的 java 应用程序。我将在我的应用程序中添加一个功能,它可以使用用户的操作并在文件上操作它们。我强迫他们实现我的接口以将他们的方法名称掌握在我手中。并强迫他们将他们的类文件放在特定路径中以将它们加载到我的应用程序中,但我不知道如何获取用户类的包名称以使用方法class.forName(packageName.ClassName) 加载它们。

有没有办法在不知道包名的情况下加载特定路径中的所有类??

【问题讨论】:

    标签: java class reflection package classloader


    【解决方案1】:

    类的名称是从 JarEntry 中提取的。

    JarFile jarFile = new JarFile(JarPath);
    Enumeration e = jarFile.entries();
    
    URL[] urls = { new URL("jar:file:" + pathToJar+"!/") };
    URLClassLoader cl = URLClassLoader.newInstance(urls);
    
    while (e.hasMoreElements()) {
        JarEntry je = (JarEntry) e.nextElement();
        if(je.isDirectory() || !je.getName().endsWith(".class")){
            continue;
        }
    // -6 because of .class
    String className = je.getName().substring(0,je.getName().length()-6);
    className = className.replace('/', '.');
    Class c = cl.loadClass(className);
    }
    

    【讨论】:

      【解决方案2】:

      您可以要求用户添加一个文本文件,在其类路径的顶层列出所有类名。然后就可以使用ClassLoader.getSystemResource来获取这些文件,获取类名了。

      【讨论】:

        【解决方案3】:

        不。 Java ClassLoader.loadClass(String) 方法要求类名必须由它们的包和类名完全限定(bb Java 语言规范中的“二进制名”)。

        可以使用 Java 反射在 Java 运行时加载和重新加载类。反射通常用于需要能够检查或修改在 Java 虚拟机中运行的应用程序的运行时行为的程序。

        动态 Java 类加载是 Java 虚拟机的一个重要特性,因为它为 Java 平台提供了在运行时安装软件组件的能力。

        动态加载类很容易。您需要做的就是获取一个 ClassLoader 并调用它的 loadClass() 方法。这是一个例子:

        public class MainClass {
        
          public static void main(String[] args){
        
          ClassLoader classLoader = MainClass.class.getClassLoader();
        
          try {
               Class aClass = classLoader.loadClass("com.jenkov.MyClass");
               System.out.println("aClass.getName() = " + aClass.getName());
          } catch (ClassNotFoundException e) {
            e.printStackTrace();
          }
        }
        

        【讨论】:

        • 是的,你说的没错,但我的问题是在加载类之前找到“com.jenkov”。
        • 下一个方法是从 jar 文件中加载所有类。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-18
        • 1970-01-01
        相关资源
        最近更新 更多