钟鼓楼 发表于 2009-2-9 09:47:41

java动态调用的范例

动态调用 JAVA CLASS/JAR,不是难事。只是随便搜索了一下,没有完整的过程。於是,综合了一下,写不个综合的范例,以便提供参考。 目录结构: view plaincopy to clipboardprint?
{CURDIR}\DynamicLoad.java
      \{test}
       \testLoad.java
{CURDIR}\DynamicLoad.java
      \{test}
       \testLoad.java
testLoad.java 的源码: view plaincopy to clipboardprint?
package test;
public class testLoad{
    public static String testing(String name){
      return "Hello, " name "! I am a public static method, I will return a String.";
    }
    public static void main(String []argv){
      System.out.println("------------------------------Begin.");
      System.out.println("Hello, dynamac load class testing!");
      for(int i=0; i<argv.length; i)
            System.out.println("argv[" (i) "]=" argv);
      System.out.println("------------------------------End.");
    }
}
package test;
public class testLoad{
    public static String testing(String name){
      return "Hello, " name "! I am a public static method, I will return a String.";
    }
    public static void main(String []argv){
      System.out.println("------------------------------Begin.");
      System.out.println("Hello, dynamac load class testing!");
      for(int i=0; i<argv.length; i)
            System.out.println("argv[" (i) "]=" argv);
      System.out.println("------------------------------End.");
    }
}DynamicLoad.java的源码: view plaincopy to clipboardprint?
import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

public class DynamicLoad extends URLClassLoader {
    public static void main(String[] args) throws Exception {
      dyn_load_class();
      dyn_load_jar();
    }
    public static void dyn_load_class() {
      File xFile = new File("test");//指向class所在的目录
      URL xUrl;
      try {
            xUrl = xFile.toURL();
            URLClassLoader ClassLoader = new URLClassLoader(new URL[]{xUrl});
            Class cd = ClassLoader.loadClass("test.testLoad"); //class名(饱含包名)
            Field[] f = cd.getDeclaredFields();
            for (int k = 0; k < f.length; k) {
                System.out.println(f);
            }
            Method mainMethod = cd.getMethod("main", new Class[]{String[].class});
            String params[]={"aa","bb"};
            mainMethod.invoke(null, new Object[] {params});//执行 main 方法
             System.out.println("\n");
      } catch (Exception e) {
            e.printStackTrace();
      }
    }

    public static void dyn_load_jar() {
      DynamicLoad d = new DynamicLoad();
      d.addPath("ttest.jar"); //指向 .jar 具体路径
    }
    public DynamicLoad() {
      super(new URL, ClassLoader.getSystemClassLoader());
    }
    public void addPath(String paths) {
      if (paths == null || paths.length() <= 0) {
            return;
      }
      String separator = System.getProperty("path.separator");
      String[] pathToAdds = paths.split(separator);
      for (int i = 0; i < pathToAdds.length; i) {
            if (pathToAdds != null && pathToAdds.length() > 0) {
                try {
                  File pathToAdd = new File(pathToAdds).getCanonicalFile();
                  addURL(pathToAdd.toURL());
                  System.out.println(pathToAdd.toURL());
                  Class c = this.loadClass("test.testLoad"); //class名(饱含包名)
                  Field[] f = c.getDeclaredFields();
                  for (int k = 0; k < f.length; k) {
                        System.out.println(f);
                  }
                  Method mainMethod = c.getMethod("testing", new Class[]{String.class});
                  String params="小橙子";
                  String ret=(String)mainMethod.invoke(null, params);//执行方法
                  System.out.println("test.testLoad.testing() return:" ret);
                } catch (Exception e) {
                  e.printStackTrace();
                }
            }
      }
    }
}
import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

   
   
                  
public class DynamicLoad extends URLClassLoader {
    public static void main(String[] args) throws Exception {
      dyn_load_class();
      dyn_load_jar();
    }
    public static void dyn_load_class() {
      File xFile = new File("test");//指向class所在的目录
      URL xUrl;
      try {
            xUrl = xFile.toURL();
            URLClassLoader ClassLoader = new URLClassLoader(new URL[]{xUrl});
            Class cd = ClassLoader.loadClass("test.testLoad"); //class名(饱含包名)
            Field[] f = cd.getDeclaredFields();
            for (int k = 0; k < f.length; k) {
                System.out.println(f);
            }
            Method mainMethod = cd.getMethod("main", new Class[]{String[].class});
            String params[]={"aa","bb"};
            mainMethod.invoke(null, new Object[] {params});//执行 main 方法
             System.out.println("\n");
      } catch (Exception e) {
            e.printStackTrace();
      }
    }

    public static void dyn_load_jar() {
      DynamicLoad d = new DynamicLoad();
      d.addPath("ttest.jar"); //指向 .jar 具体路径
    }
    public DynamicLoad() {
      super(new URL, ClassLoader.getSystemClassLoader());
    }
    public void addPath(String paths) {
      if (paths == null || paths.length() <= 0) {
            return;
      }
      String separator = System.getProperty("path.separator");
      String[] pathToAdds = paths.split(separator);
      for (int i = 0; i < pathToAdds.length; i) {
            if (pathToAdds != null && pathToAdds.length() > 0) {
                try {
                  File pathToAdd = new File(pathToAdds).getCanonicalFile();
                  addURL(pathToAdd.toURL());
                  System.out.println(pathToAdd.toURL());
                  Class c = this.loadClass("test.testLoad"); //class名(饱含包名)
                  Field[] f = c.getDeclaredFields();
                  for (int k = 0; k < f.length; k) {
                        System.out.println(f);
                  }
                  Method mainMethod = c.getMethod("testing", new Class[]{String.class});
                  String params="小橙子";
                  String ret=(String)mainMethod.invoke(null, params);//执行方法
                  System.out.println("test.testLoad.testing() return:" ret);
                } catch (Exception e) {
                  e.printStackTrace();
                }
            }
      }
    }
}
   
再,还有编译方法(保存成一下.cmd文件,双击即可看到结果): view plaincopy to clipboardprint?
@ECHO OFF
javac test\*.java
jar cvf ttest.jar ./test/*.class
javacDynamicLoad.java
java   DynamicLoad
ECHO.
PAUSE
   上一页
页: [1]
查看完整版本: java动态调用的范例