java動態調用的範例(包括class/jar)

動態調用 JAVA CLASS/JAR,不是難事。只是隨便搜索了一下,沒有完整的過程。於是,綜合了一下,寫不個綜合的範例,以便提供參考。 目錄結構:
{CURDIR}/DynamicLoad.java
       /{test}
        /testLoad.java

testLoad.java 的源碼:
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[i]);
        System.out.println("------------------------------End.");
    }

}
DynamicLoad.java的源碼:
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[k]);
            }

            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[0], 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[i] != null && pathToAdds[i].length() > 0) {
                try {

                    File pathToAdd = new File(pathToAdds[i]).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[k]);
                    }

                    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文件,雙擊即可看到結果):
@ECHO OFF

javac test/*.java
jar cvf ttest.jar ./test/*.class

javac  DynamicLoad.java
java   DynamicLoad

ECHO.
PAUSE

(完——希望這次的格式不要亂亂的) (格式還是有問題,(1)已經很好的格式,偏偏要加入多一個空行!(2)自行輸入的代碼中的硬回車不會轉換成<br/>)
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值