Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.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 尝试使用加载的类时发生ClassCastException_Java_Reflection_Casting - Fatal编程技术网

Java 尝试使用加载的类时发生ClassCastException

Java 尝试使用加载的类时发生ClassCastException,java,reflection,casting,Java,Reflection,Casting,Java版本:6 我已经构建了一个aotuloader,它从JAR中加载类并对它们进行实例处理。所以我得到了一个与特定路径和抽象类匹配的所有实例的ArrayList package com.geNAZt.RegionShop.Util; import com.geNAZt.RegionShop.RegionShopPlugin; import java.io.IOException; import java.lang.reflect.Constructor; import java.lang

Java版本:6

我已经构建了一个aotuloader,它从JAR中加载类并对它们进行实例处理。所以我得到了一个与特定路径和抽象类匹配的所有实例的ArrayList

package com.geNAZt.RegionShop.Util;

import com.geNAZt.RegionShop.RegionShopPlugin;

import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

public class Loader {
    public static <T> ArrayList<T> loadFromJAR(RegionShopPlugin plugin, String path, Class interf) {
        ArrayList<T> returnObjects = new ArrayList<T>();

        try {
            String pathToJar = Loader.class.getProtectionDomain().getCodeSource().getLocation().getPath();
            JarFile jarFile = new JarFile(pathToJar);
            Enumeration e = jarFile.entries();

            URL[] urls = { new URL("jar:file:" + pathToJar +"!/") };
            ClassLoader cl = URLClassLoader.newInstance(urls);

            while (e.hasMoreElements()) {
                JarEntry je = (JarEntry) e.nextElement();

                if(je.isDirectory() || !je.getName().endsWith(".class") || !je.getName().substring(0,je.getName().length()-6).replace("/", ".").contains(path +".")){
                    continue;
                }

                try {
                    String className = je.getName().substring(0,je.getName().length()-6);
                    className = className.replace('/', '.');
                    Class<?> c = cl.loadClass(className);

                    if(!c.getSuperclass().getName().equals(interf.getName())) {
                        continue;
                    }

                    Constructor[] cons = c.getDeclaredConstructors();

                    for(Constructor con : cons) {
                        try {
                            returnObjects.add((T)con.newInstance(plugin));
                            break;
                        } catch (InvocationTargetException e1) {
                            e1.printStackTrace();
                            continue;
                        } catch (InstantiationException e1) {
                            e1.printStackTrace();
                            continue;
                        } catch (IllegalAccessException e1) {
                            e1.printStackTrace();
                            continue;
                        } catch (IllegalArgumentException e1) {
                            e1.printStackTrace();
                            continue;
                        }
                    }
                } catch(ClassNotFoundException er) {
                    er.printStackTrace();
                    continue;
                }

            }
        } catch(IOException e) {
            e.printStackTrace();

            return null;
        }

        return returnObjects;
    }
}
package com.geNAZt.RegionShop.Util;
导入com.geNAZt.RegionShop.RegionShopPlugin;
导入java.io.IOException;
导入java.lang.reflect.Constructor;
导入java.lang.reflect.InvocationTargetException;
导入java.net.URL;
导入java.net.URLClassLoader;
导入java.util.ArrayList;
导入java.util.Enumeration;
导入java.util.jar.JarEntry;
导入java.util.jar.jar文件;
公共类加载器{
公共静态ArrayList loadFromJAR(RegionShopPlugin插件,字符串路径,类interf){
ArrayList returnObjects=新的ArrayList();
试一试{
字符串pathToJar=Loader.class.getProtectionDomain().getCodeSource().getLocation().getPath();
JarFile JarFile=新的JarFile(pathToJar);
枚举e=jarFile.entries();
URL[]URL={newurl(“jar:file:+pathToJar+”!/”};
ClassLoader cl=URLClassLoader.newInstance(URL);
而(e.hasMoreElements()){
JarEntry je=(JarEntry)e.nextElement();
if(je.isDirectory()| |!je.getName().endsWith(“.class”)| |!je.getName().substring(0,je.getName().length()-6)。替换(“/”,“)。包含(路径+)){
继续;
}
试一试{
字符串className=je.getName().substring(0,je.getName().length()-6);
className=className.replace(“/”,“.”);
c类=cl.loadClass(类名);
如果(!c.getSuperclass().getName().equals(interf.getName())){
继续;
}
构造函数[]cons=c.getDeclaredConstructors();
对于(构造函数con:cons){
试一试{
添加((T)con.newInstance(plugin));
打破
}捕获(调用TargetException e1){
e1.printStackTrace();
继续;
}捕获(实例化异常e1){
e1.printStackTrace();
继续;
}捕获(IllegalacessException e1){
e1.printStackTrace();
继续;
}捕获(IllegalArgumentException e1){
e1.printStackTrace();
继续;
}
}
}捕获(ClassNotFounder异常){
printStackTrace();
继续;
}
}
}捕获(IOE异常){
e、 printStackTrace();
返回null;
}
归还物品;
}
}
它工作正常,我可以通过以下方式获得正确的对象:

private ArrayList<ShopCommand> loadedCommands = new ArrayList<ShopCommand>();
loadedCommands = loadFromJAR(pl, "com.geNAZt.RegionShop.Command.Shop", ShopCommand.class);
private ArrayList loadedCommands=new ArrayList();
loadedCommands=loadFromJAR(pl,“com.geNAZt.RegionShop.Command.Shop”,ShopCommand.class);
如果我做一个日志,所有对象似乎都很好:

12:24:40[INFO][RegionShop]加载的ShopCommands:[com.geNAZt.RegionShop.Command.Shop。ShopAdd@3b39c41d,com.geNAZt.RegionShop.Command.Shop。ShopBuy@4d7a6a4b,com.geNAZt.RegionS hop.Command.Shop。ShopDetail@1fd889aa,com.geNAZt.RegionShop.Command.Shop。ShopEquip@4136083b,com.geNAZt.RegionShop.Command.Shop。ShopList@42567aef,com.geNAZt.RegionShop.Comman d、 商店。ShopName@3ba102ef]

但是我想用它们。为了使用它们,我想将它们转换为ShopCommand类。但是我得到了这个错误:

12:24:40[SCHWERWIEGEND]启用RegionShop v1.1.0b3时出错(是否为最新版本?) java.lang.ClassCastException:com.geNAZt.RegionShop.Command.Shop.ShopAdd无法强制转换为com.geNAZt.RegionShop.Command.ShopCommand 位于com.geNAZt.RegionShop.Command.ShopExecutor。(ShopExecutor.java:40) 位于com.geNAZt.RegionShop.RegionShopPlugin.oneable(RegionShopPlugin.java:80) 位于org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:217) 位于org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:457) 位于org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:383) 位于org.bukkit.craftbukkit.v1_5_R3.CraftServer.loadPlugin(CraftServer.java:305) 位于org.bukkit.craftbukkit.v1_5_R3.CraftServer.enablePlugins(CraftServer.java:287) 位于net.minecraft.server.v1_5_R3.MinecraftServer.j(MinecraftServer.java:310) 位于net.minecraft.server.v1_5_R3.MinecraftServer.e(MinecraftServer.java:289) 位于net.minecraft.server.v1_5_R3.MinecraftServer.a(MinecraftServer.java:249) 位于net.minecraft.server.v1_5_R3.indivatedServer.init(indivatedServer.java:152) 位于net.minecraft.server.v1_5_R3.MinecraftServer.run(MinecraftServer.java:388) 位于net.minecraft.server.v1_5_R3.ThreadServerApplication.run(源文件:573)


是否可以将对象强制转换到抽象类中,以便从该类获取api?或者是否有其他方法从类中获取API?

此异常是类身份危机的结果。不能在类装入器之间强制转换。如上所述:

当使用多个类时,也可能出现其他类型的混淆 装载机。图2显示了一个类身份危机的示例 当一个接口和关联的实现都是 由两个独立的类装入器装入。即使名称和二进制 接口和类的实现是相同的 无法将来自一个加载程序的类的实例识别为 从其他加载程序实现接口

编辑
虽然解决办法是
URL[] urls = { new URL("jar:file:" + pathToJar +"!/") };
ClassLoader cl = new URLClassLoader(urls,ClassLoader.getSystemClassLoader());