Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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_Dynamic_Classloader - Fatal编程技术网

java中的动态类加载问题

java中的动态类加载问题,java,class,dynamic,classloader,Java,Class,Dynamic,Classloader,嗨,我有一个代码,它将一个类文件加载到我的程序中。当我从eclipse运行/调试它时,我总是从bin目录中选择类文件。当我将程序编译成JAR文件时,加载无法工作。 这些是加载类文件的行 public void load_dynamic_tag(String file_path) throws MalformedURLException, ClassNotFoundException, InstantiationException, IllegalA

嗨,我有一个代码,它将一个类文件加载到我的程序中。当我从eclipse运行/调试它时,我总是从bin目录中选择类文件。当我将程序编译成JAR文件时,加载无法工作。 这些是加载类文件的行

public void load_dynamic_tag(String file_path)
            throws MalformedURLException, ClassNotFoundException,
            InstantiationException, IllegalAccessException {
        File f = new File(file_path);// some folder's path
        URI uri = f.toURI();
        URL url = uri.toURL();
        URL[] urls = new URL[] { url };
        // create a new class loader for this directory
        ClassLoader cl = new URLClassLoader(urls);
        // load the class file "MyAlgo.class"
        String name = f.getName();
        name = name.substring(0, name.lastIndexOf("."));
        name = "Tagging." + name;
        @SuppressWarnings("unchecked")
        Class<TaggingStrategy> c = (Class<TaggingStrategy>) cl.loadClass(name);
        // TaggingStrategy tag=c.newInstance();
        tag = c.newInstance();
    }
公共无效加载\u动态\u标记(字符串文件\u路径)
抛出畸形的DurLexException、ClassNotFoundException、,
实例化异常,非法访问异常{
File f=新文件(File_path);//某个文件夹的路径
URI=f.toURI();
URL=uri.toURL();
URL[]URL=新URL[]{URL};
//为此目录创建一个新的类加载器
ClassLoader cl=新的URLClassLoader(URL);
//加载类文件“MyAlgo.class”
String name=f.getName();
name=name.substring(0,name.lastIndexOf(“.”);
name=“标记。”+名称;
@抑制警告(“未选中”)
c类=(类)cl.loadClass(名称);
//TaggingStrategy tag=c.newInstance();
tag=c.newInstance();
}
这就是我得到的错误

java.lang.ClassNotFoundException: Tagging.Tag_by_lenght_filename
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at Tagging.Tags_all.load_dynamic_tag(Tags_all.java:233)
        at Command.LoadTagCommandExecutor.execute(LoadTagCommandExecutor.java:24
)
        at GUI.DropBox$2.handleEvent(DropBox.java:248)
        at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
        at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
        at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4066)
        at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3657)
        at GUI.DropBox.showGUI(DropBox.java:168)
        at GUI.Try_control$5.handleEvent(Try_control.java:135)
        at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
        at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
        at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4066)
        at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3657)
        at GUI.Try_control.<init>(Try_control.java:161)
        at GUI.NewSWTApp$2$1$2.run(NewSWTApp.java:121)
        at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
        at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:134)
        at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4041)
        at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3660)
        at Service.Main.main(Main.java:79)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
java.lang.ClassNotFoundException:Tagging.Tag\u by\u lengh\u filename
位于java.net.URLClassLoader$1.run(未知源)
位于java.net.URLClassLoader$1.run(未知源)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.net.URLClassLoader.findClass(未知源)
位于java.lang.ClassLoader.loadClass(未知源)
位于java.lang.ClassLoader.loadClass(未知源)
at Tagging.Tags\u all.load\u dynamic\u tag(Tags\u all.java:233)
在Command.LoadTagCommandExecutor.execute(LoadTagCommandExecutor.java:24
)
位于GUI.DropBox$2.handleEvent(DropBox.java:248)
位于org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
位于org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
位于org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4066)
在org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3657)上
在GUI.DropBox.showGUI(DropBox.java:168)
在GUI.Try_control$5.handleEvent(Try_control.java:135)
位于org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
位于org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
位于org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4066)
在org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3657)上
在GUI.Try_control.(Try_control.java:161)
在GUI.NewSWTApp$2$1$2.run(NewSWTApp.java:121)
位于org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
在org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:134)上
位于org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4041)
在org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3660)上
at Service.Main.Main(Main.java:79)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(未知源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke处(未知源)
位于java.lang.reflect.Method.invoke(未知源)
位于org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
我做错了什么?
tnx allot

URLClassLoader在目录和jar文件中查找类。无论您以“file_path”的形式传入什么,都需要是一个指向jar或包含您要查找的类的目录的路径。如果是目录,则应以“/”结尾。可能您使用的是相对文件路径,根据它的运行位置,它具有不同的含义。传入的是什么,类位于何处?

我猜文件路径不再工作,您的类位于.jar文件中,因此普通文件不起作用。 您需要做的是在.jar文件中定位类文件:

File myFile = new File(YourClass.class.getProtectionDomain().getCodeSource().getLocation().toURI()));
JarFile myJar = new JarFile(myFile);
URLCLassLoader myCL = new URLClassLoader(new URL[]{new File("path/to/myjar.jar").toURI().toURL()});
然后按如下方式获取jar中的条目:

Enumeration entries = jar.entries();

现在,请参阅
枚举
如何列出类文件的文档。(遍历所有文件,选择以.class结尾的文件)从这里,您知道类名,因此可以加载它。

实际上,您只需将jar文件放入类路径并调用

Class<TaggingStrategy> c = (Class<TaggingStrategy>)Class.forName("Tagging.MyAlgo");
如果希望代码在这两种情况下都能工作,那么需要确保URL指向eclipse中的bin目录,并指向jar文件,以防使用已编译的jar文件


如果需要发现哪些类文件可用,可以使用文件系统抽象层(),它可以从目录或jar文件创建文件系统。

我尝试使用path p=path.get(class\u file\u path)发送完整路径;File class_File=新文件(p.toAbsolutionPath().toString());但它不起作用是的,请再读一遍我的答案。类文件的路径是无用的。给它一个目录或jar文件,就像您正在向类路径添加目录或jar以进行编译或运行一样。例如,如果您的类是com.foo.Bar,则文件将位于/com/foo/Bar.class。您需要将“”传递给类加载器才能找到类Bar。如果我想从jar文件中添加一个类,那么如果该类文件不在jar文件中,您应该能够提供一个绝对路径。请注意,类所在的包必须与目录结构匹配,请参见上的示例(另外,可能需要用点替换路径中的斜杠),className=classPath.replace(“/”,“.”)