Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这是类装入器的不正确使用还是不良做法?_Java_Class_Classloader - Fatal编程技术网

Java 这是类装入器的不正确使用还是不良做法?

Java 这是类装入器的不正确使用还是不良做法?,java,class,classloader,Java,Class,Classloader,我的程序设计为从一个可运行的jar文件启动,根据需要设置所有内容,然后在另一个jar文件中加载一个类来启动程序。这允许自我更新、重新启动等。好吧,我的类加载代码对我来说似乎有点古怪。下面是我用来加载程序的代码。这是不正确的使用还是错误的做法 try { Preferences.userRoot().put("clientPath", Run.class.getProtectionDomain().getCodeSource().getLocation().toURI().

我的程序设计为从一个可运行的jar文件启动,根据需要设置所有内容,然后在另一个jar文件中加载一个类来启动程序。这允许自我更新、重新启动等。好吧,我的类加载代码对我来说似乎有点古怪。下面是我用来加载程序的代码。这是不正确的使用还是错误的做法

    try {
        Preferences.userRoot().put("clientPath", Run.class.getProtectionDomain().getCodeSource().getLocation().toURI().toString()); //Original client location; helps with restarts
    } catch (URISyntaxException e1) {
        e1.printStackTrace();
    }

    try {
        Preferences.userRoot().flush();
    } catch (BackingStoreException e1) {
        e1.printStackTrace();
    }


    File file = new File(path); // path of the jar we will be launching to initiate the program outside of the Run class
    URL url = null;
    try {
        url = file.toURI().toURL(); // converts the file path to a url
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }
    URL[] urls = new URL[] { url };
    ClassLoader cl = new URLClassLoader(urls);

    Class cls = null;
    try {
        cls = cl.loadClass("com.hexbit.EditorJ.Load"); // the class we are loading to initiate the program
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    try {
        cls.newInstance();  // starts the class that has been loaded and the program is on its way
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }

您遇到的最大问题是,当您遇到异常时,您会假装记录异常可以继续,就好像什么也没发生一样

如果您聚合try/catch块,您的代码将更短,更易于阅读,并且不会假设异常实际上并不重要

试试这个例子

public static Object load(String path, String className) {
    try {
        URL url = new File(path).toURI().toURL();
        ClassLoader cl = new URLClassLoader(new URL[] { url });
        return cl.loadClass(className).newInstance();
    } catch (Exception e) {
        throw new IllegalStateException("Unable to load "+className+" " + e);
    }
}

将其放入这样的try块似乎有点通用,但您可以从异常e获取异常的类型,对吗?@StevenTylerFrizell correct,您所采取的操作在每种情况下都是相同的,因此您不需要为它们都使用不同的处理程序。