-2

我有一个要求,我必须根据输入动态加载 java 程序。所有 java 类文件都放在文件夹中:C://Users/me/workspace/File/bin/Encrypt/。该文件夹中有3个类文件:Class1.class、Class2.class、Class3.class

为了在运行时获取它们,我使用以下代码:

  package First;

  import java.io.File;
  import java.net.MalformedURLException;
  import java.net.URL;
  import java.net.URLClassLoader;

  public class Main 
  {

public static void main(String[] args) {

            // Say Class.class is the input file to be picked up.
    String abc = "Class1.class";    

   try { 
  File file = new File("C:\\Users\\me\\workspace\\File\\bin\\Encrypt"); 

    //convert the file to URL format
    URL url = file.toURI().toURL(); 
    URL[] urls = new URL[]{url}; 

       //load this folder into Class loader
    ClassLoader cl = new URLClassLoader(urls); 
    Class  cls = cl.loadClass(abc);

    System.out.println("cls.getName() = " + cls.getName());

    cls.encrypt();              

            } 
        catch ( ClassNotFoundException | MalformedURLException e) {
            e.printStackTrace();
            }
}
   }

我在这里面临以下问题:

  1. 上面的代码显示错误:.NoClassDefFoundError: Class1?? 在路径中使用了所有类型的 - / ,\ ,//,\。
  2. 我如何在 Class1 文件中调用方法 sum() ?
4

1 回答 1

0

因为你拥有...\bin\Encrypt的是你的课程所在的文件夹,我敢打赌你的课程的包是Encrypt. 在这种情况下abc应该是

String abc = "Enrcypt.Class1";

如果这些类在默认包中,这意味着它们没有包声明而不是使用

String abc = "Class1";

另请注意,类名称中不需要扩展.class名。

要调用以这种方式加载的类的方法,您应该参考java refelction api

首先使用getMethod从Class中获取Method对象 cl

而不是使用该方法对象的方法调用来调用该函数。如果要调用的方法不是静态的,则需要提供动态加载的类的实例,如果它是静态的,则只需传递 null。

于 2013-03-03T12:14:55.537 回答