首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >通过绝对路径导入Java中的

通过绝对路径导入Java中的
EN

Stack Overflow用户
提问于 2018-05-29 11:33:33
回答 2查看 4.2K关注 0票数 0

在代码运行时,我一直试图通过绝对路径导入.class,但我不知道如何实现。

当类已经在项目的构建路径中时,我通过Class.forName();找到了一种导入类的方法,但是我需要找到一种方法来加载不存在于构建路径中的类。

目标是:

  1. 用户可以上传自己的.class文件,然后在本地保存到特定的文件夹中,路径保存在数据库中。
  2. 通过GUI,用户可以选择要在代码运行时使用的文件
  3. 当代码运行时,我的代码应该通过这个给定的绝对路径加载类。

问题在于第三点,因为我不知道在代码运行时是否可以加载类。

我尝试过使用URLClassLoader,但是我得到了ClassNotFound错误。

编辑:

基本上,我有一个静态函数,它应该以名称返回Class,但是urlClassLoader.loadClass()会抛出错误。

文件名为J48.class,因此,对于className参数,我尝试使用"J48“、"J48.class”,但没有一种方法有效。

此外,我还尝试将文件夹分类器设置为构建路径,并将参数设置为"weka.classifiers.trees.J48“,这是这个类的完整路径(包结构为weka.classifiers.trees)。

代码语言:javascript
代码运行次数:0
运行
复制
`public static Class getClassByName(String className) throws MalformedURLException, ClassNotFoundException 
    {
        URLClassLoader urlClassLoader = URLClassLoader.newInstance(new URL[] {
                   new URL("file:///D:\\xampp\\htdocs\\prog-ing\\classifiers\\")
        });

        Class class = urlClassLoader.loadClass(className);

        return class;
    }`
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-04 18:19:02

好的,经过一番思考,我只得到了一个解决方案(仍然不满意),它是:

每个需要由用户上传的类都被保存到这个项目的工作区中,因此我能够使用Class.forName();来获得类,在我的例子中指出了这个上传类的“文件夹”:Class.forName("classifiers.className");

票数 0
EN

Stack Overflow用户

发布于 2018-05-29 19:45:29

我想我有个解决你问题的建议..。

我知道两种选择:

  • 选项1:从目录读取类文件。

示例:

代码语言:javascript
代码运行次数:0
运行
复制
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class Test5 extends ClassLoader {

    private static final String PATH = "C://myFiles//";

    public static void main(String[] args) {
        Class clazz = getClassFromName("Test4");
        System.out.println(clazz);
    }

    private static Class getClassFromName(String className) {
        File file = new File(PATH + className + ".class");

        try {
            FileInputStream fileInputStream = new FileInputStream(file);
            byte[] bytes = new byte[fileInputStream.available()];

            fileInputStream.read(bytes);

            return defineClass(className, bytes, 0, bytes.length);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

}

这将打印如下内容:

类Test4

  • 选项2:从JAR读取类文件。

示例:

代码语言:javascript
代码运行次数:0
运行
复制
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

public class Test5 {

    private static final String PATH = "C://myFiles//";

    public static void main(String[] args) {
        Class clazz = getClassFromFile("myJar.jar", "com.mypackage.Test4");
        System.out.println(clazz);
    }

    private static Class getClassFromFile(String fromFile, String className) {
        try {
            URL url = new URL("file:////" + PATH + fromFile);
            URLClassLoader urlClassLoader = URLClassLoader.newInstance(
                new URL[] {
                    url
            });

            return urlClassLoader.loadClass(className);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }

        return null;
    }

}

这将打印如下内容:

类com.mypackage.Test4

注意,要读取jar文件,我必须将包的完整路径放到类文件中。

希望我能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50583347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档