Java 从外部jar加载类

Java 从外部jar加载类,java,Java,这是我的第一个java程序,请原谅我太幼稚了 我有一个第三方罐。我想在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; impo

这是我的第一个java程序,请原谅我太幼稚了

我有一个第三方罐。我想在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_对象是CSVAPI的一个实例。如果没有,则只能使用对象方法(toString、equals等)

为此,您可以执行以下操作:

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

请注意,您的类路径中需要有CSVAPI

您必须让编译器知道cls_对象是CSVAPI的实例。如果没有,则只能使用对象方法(toString、equals等)

为此,您可以执行以下操作:

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

请注意,您的类路径中需要有CSVAPI

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

        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();

将完成这项工作。

对象
类不知道
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();

将完成这项工作。

如果这是您的第一个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();
    }
}
编译(请注意,源代码文件名必须与类名匹配):

运行:


如果这是您的第一个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();
    }
}
编译(请注意,源代码文件名必须与类名匹配):

运行:


对象cls_Object=cls.newInstance();-->对象类如何知道CSVAPI的方法,只是转换到那个特定的类…哇,为什么你要做所有这些反射的东西,而不是仅仅使用
new CSVAPI()
并在类路径中包含
vendorcatalogapi.jar
??我认为摆弄类加载不适合第一个java程序…@piet.t:不知道还有更简单的方法存在!对象cls_Object=cls.newInstance();-->对象类如何知道CSVAPI的方法,只是转换到那个特定的类…哇,为什么你要做所有这些反射的东西,而不是仅仅使用
new CSVAPI()
并在类路径中包含
vendorcatalogapi.jar
??我认为摆弄类加载不适合第一个java程序…@piet.t:不知道还有更简单的方法存在+1:在第一个java程序中就是这样做的!我收到错误:
错误:找不到符号符号:class CSVAPI
确定,由
import rediff.inecom.catalog.product.CSVAPI解决。感谢您的回答+1:这是在第一个java程序中实现的方法!我收到错误:
错误:找不到符号符号:class CSVAPI
确定,由
import rediff.inecom.catalog.product.CSVAPI解决。谢谢你的回答