如何在运行时将新的java文件加载到现有的Jar中?

时间:2016-03-11 23:47:38

标签: java

我有一个特定的要求,我需要加载一个类" abc"并调用方法" xyz"在运行期间?这可能吗?类文件是否应该出现在特定位置?

我正在尝试下面的代码但是得到了ClassNotFoundException

        File file = new File("location of the class file");
        URL url = file.toURI().toURL();
        URL[] urls = new URL[] {url};

        URLClassLoader myClass = new URLClassLoader(urls);
        Class<?> methodClass = myClass.loadClass("classname");
        Method method = methodClass.getDeclaredMethod(methodname);

1 个答案:

答案 0 :(得分:1)

Reflection允许您通过指定类和方法的名称来创建实例并调用其方法。根据您的描述,您似乎想要这个功能。

让它更容易理解。你有反思课程

package com.reflect;

public class Reflect {

  public void testMethod() { System.out.println("Test") }

}

然后你有了这个主类,你可以在这里调用这个方法:

package com.reflect.main;

import java.lang.reflect.Method;

public class ReflectApp {

  public static void main(String[] args) {

    Class noparams[] = {};

    try{
      //load the Reflect at runtime
      Class cls = Class.forName("com.reflect.Reflect");
      Object obj = cls.newInstance();

      //call the testMethod method
      Method method = cls.getDeclaredMethod("testMethod", noparams);
      method.invoke(obj, null);
    } catch(Exception ex) {
      ex.printStackTrace();
    }
  }
}

再次link再看一下我自己举例的教程。

如果你必须动态加载jar(如果它在编译时没有添加到类路径中),你可以这样做:

// Getting the jar URL which contains target class
URL[] classLoaderUrls = new URL[]{new URL("file:///home/ashraf/Desktop/simple-bean-1.0.jar")};
URLClassLoader child = new URLClassLoader (classLoaderUrls, this.getClass().getClassLoader());
Class classToLoad = Class.forName ("com.MyClass", true, child);
Method method = classToLoad.getDeclaredMethod ("myMethod");
Object instance = classToLoad.newInstance ();
Object result = method.invoke (instance);