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

时间:2015-07-22 05:19:23

标签: java class reflection package classloader

我正在编写一个对文本文件执行某些操作的Java应用程序。我将在我的应用程序中添加一项能够使用用户操作并在文件中操作它们的功能。我强迫他们实现我的界面以保存他们的方法名称。并强迫他们将他们的类文件放在特定路径中以在我的应用中加载它们但我不知道如何使用方法class.forName(packageName.ClassName)来获取用户类的包名称。

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

3 个答案:

答案 0 :(得分:2)

类的名称是从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);
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

不。 Java ClassLoader.loadClass(String)方法要求类名必须通过其包和类名完全限定(bb"二进制名称"在Java语言规范中)。

可以使用Java Reflection在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();
  }
}