Java动态加载类
发布时间:2020-09-25 19:30:33  所属栏目:Java  来源:互联网 
            导读:我正在尝试将类动态加载到组件中.我正在使用文件选择器来选择要加载的.JAR文件,然后选择一个选项窗格来获取类的名称. 我拖网了互联网,寻找如何将一个java文件转换为一个URL,以便将其加载到URLClassLoader中,我已经提出: File myFile = filechooser.getSelect
                
                
                
            | 
                         我正在尝试将类动态加载到组件中.我正在使用文件选择器来选择要加载的.JAR文件,然后选择一个选项窗格来获取类的名称. 我拖网了互联网,寻找如何将一个java文件转换为一个URL,以便将其加载到URLClassLoader中,我已经提出: File myFile = filechooser.getSelectedFile();
String className = JOptionPane.showInputDialog(
    this,"Class Name:","Class Name",JOptionPane.QUESTION_MESSAGE);
URL myUrl= null;
try {
    myUrl = myFile.toURL();
} catch (MalformedURLException e) {
}
URLClassLoader loader = new URLClassLoader(myUrl);
loader.loadClass(className); 
 我现在收到一个“找不到符号”的错误,将URL加载到URLClassLoader中 解决方法我喜欢 the answer by Zellus中提到的ClassPathHacker类,但是它已经不再推荐使用了调用和坏习惯,所以这里是一个重写版本,它也缓存了Classloader和addUrl方法:import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.io.IOException;
import java.io.File;
public class ClassPathHacker{
    private static final Class<URLClassLoader> URLCLASSLOADER =
        URLClassLoader.class;
    private static final Class<?>[] PARAMS = new Class[] { URL.class };
    public static void addFile(final String s) throws IOException{
        addFile(new File(s));
    }
    public static void addFile(final File f) throws IOException{
        addURL(f.toURI().toURL());
    }
    public static void addURL(final URL u) throws IOException{
        final URLClassLoader urlClassLoader = getUrlClassLoader();
        try{
            final Method method = getAddUrlMethod();
            method.setAccessible(true);
            method.invoke(urlClassLoader,new Object[] { u });
        } catch(final Exception e){
            throw new IOException(
                "Error,could not add URL to system classloader");
        }
    }
    private static Method getAddUrlMethod()
        throws NoSuchMethodException{
        if(addUrlMethod == null){
            addUrlMethod =
                URLCLASSLOADER.getDeclaredMethod("addURL",PARAMS);
        }
        return addUrlMethod;
    }
    private static URLClassLoader urlClassLoader;
    private static Method addUrlMethod;
    private static URLClassLoader getUrlClassLoader(){
        if(urlClassLoader == null){
            final ClassLoader sysloader = 
                ClassLoader.getSystemClassLoader();
            if(sysloader instanceof URLClassLoader){
                urlClassLoader = (URLClassLoader) sysloader;
            } else{
                throw new IllegalStateException(
                    "Not an UrlClassLoader: "
                    + sysloader);
            }
        }
        return urlClassLoader;
    }
}                        (编辑:莱芜站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!  | 
                  
