簡體   English   中英

從外部jar加載課程

[英]Loading a class from an external jar

這是我的第一個Java程序,如果它太幼稚,請原諒。

我有一個3rd jar。 我想實例化jar中的類並能夠使用其方法。 有關jar中的類的一些詳細信息:

Class File: rediff.inecom.catalog.product.CSVAPI
Constructor: CSVAPI()
Method: UpdateCSVAPI(key, csvpath)
Return: String

我編寫了以下程序:

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

class MyLoaderClass{
    public void myLoaderFunction(){
        File file  = new File("vendorcatalogapi.jar");
        try {
            URL url = file.toURI().toURL();  
            URL[] urls = new URL[]{url};
            ClassLoader cl = new URLClassLoader(urls);

            Class cls = cl.loadClass("rediff.inecom.catalog.product.CSVAPI");
            Object cls_object = cls.newInstance();
            System.out.println(cls_object);
            String output = cls_object.UpdateCSVAPI(12345,"myfile.csv");
            System.out.println(output);
            System.out.println("try");
        }
        catch (Exception e) { 
            System.out.println("catch");
            e.printStackTrace(); 
        }
    }

    public static void main(String args[]){
        new MyLoaderClass().myLoaderFunction();
    }
}

我正在嘗試使用以下命令進行編譯:

javac -cp vendorcatalogapi.jar temp.java

但是我收到以下錯誤:

temp.java:17: error: cannot find symbol
            String output = cls_object.UpdateCSVAPI(12345,"myfile.csv");
                                      ^
  symbol:   method UpdateCSVAPI(int,String)
  location: variable cls_object of type Object
1 error

看起來該對象未正確初始化。 請有人可以幫助我正確的方法

您必須讓編譯器知道cls_object是CSVAPI的實例。 如果不這樣做,則只能使用對象方法(toString,equals等)。

為此,您可以執行以下操作:

 rediff.inecom.catalog.product.CSVAPI cls_object = (rediff.inecom.catalog.product.CSVAPI) cls.newInstance();

請注意,您需要在類路徑中包含CSVAPI!

如果這是您的第一個Java程序,那么動態加載該類可能是過大了。 只需正常使用它,然后讓默認的類加載器加載它即可:

import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.io.IOException;
import rediff.inecom.catalog.product.CSVAPI;

class MyFirstClass{
    public void myFunction() {
        CSVAPI cvsapi = new CSVAPI();
        System.out.println(cvsapi);
        String output = cvsapi.UpdateCSVAPI(12345,"myfile.csv");
        System.out.println(output);

        System.out.println("Success!");
    }

    public static void main(String args[]){
        new MyFirstClass().myFunction();
    }
}

編譯(請注意,源代碼文件名必須與類名匹配):

javac -cp vendorcatalogapi.jar MyFirstClass.java

跑:

java -cp .:vendorcatalogapi.jar MyFirstClass (on Unix based)
java -cp .;vendorcatalogapi.jar MyFirstClass (on Windows)

Object類不知道rediff.inecom.catalog.product.CSVAPI類的方法。

        Class cls = cl.loadClass("rediff.inecom.catalog.product.CSVAPI");
        Object cls_object = cls.newInstance();

因此,需要顯式強制轉換

rediff.inecom.catalog.product.CSVAPI object = 
                  (rediff.inecom.catalog.product.CSVAPI) cls.newInstance();

會做的工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM