我有一个返回(以我为例)Block的函数。
我有一个名为blockName的字符串,该字符串的值将设置为“ dirt”。
之后,我将创建一个名为blockNameConverted的新字符串。这将是BlockDirt并且我还有一个类BlockDirt(它不在同一包中):

public Block getBlockFromId(int id){

    String blockName = iBlockRegistry.getStrintFromId(id).getStringValue(); // Yeah i know.. it's Strint :D
    String blockNameConverted = "Block" + blockName.substring(0, 1).toUpperCase() + blockName.substring(1); //Capitalize the d of dirt

    debug.Log("Blockname: " + blockName);  //Outputs in Console "Blockname: dirt"
    debug.Log("Converted Blockname: " + blockNameConverted); //Outputs in Console "Converted Blockname: BlockDirt"

    Class<?> clas;
    try {
        clas = Class.forName(blockNameConverted);
    } catch (ClassNotFoundException e) {
        clas = BlockDirt.class.getClass(); //If class not found use this class as "default"
        e.printStackTrace();
    }
    Block blockClass = Block.class.cast(clas);

    return blockClass;
}


我认为clas = Class.forName(blockNameConverted);应该搜索类BlockDirt,但是当我调用此方法时,出现此错误:

java.lang.ClassNotFoundException: BlockDirt
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at registry.MinecraftRegistry.getBlockFromId(MinecraftRegistry.java:39)
    at registry.BlockRegistry.register(BlockRegistry.java:11)
    at block.Block.registerBlock(Block.java:21)
    at engineTester.MainGameLoop.main(MainGameLoop.java:126)


还有这个:

Exception in thread "main" java.lang.ClassCastException: Cannot cast java.lang.Class to block.Block
    at java.lang.Class.cast(Unknown Source)
    at registry.MinecraftRegistry.getBlockFromId(MinecraftRegistry.java:44)
    at registry.BlockRegistry.register(BlockRegistry.java:11)
    at block.Block.registerBlock(Block.java:21)
    at engineTester.MainGameLoop.main(MainGameLoop.java:126)


我究竟做错了什么?

我还没有发布完整的课程,因为我只想知道如何搜索课程并返回(或使用)它。

使用Block blockClass = Block.class.cast(clas);时,我希望得到与Block blockClass = new BlockDirt();相同的结果,但是我不能直接在代码中键入此内容,因为以后我也想创建其他块,并且不想每次获取BlockDirt的id。

我希望你能理解我,因为英语不是我的母语:D

最佳答案

java.lang.ClassNotFoundException: BlockDirt


您的第一个异常告诉您,类BlockDirt在类路径中不存在。您还需要正确的软件包名称。例:

Class.forName("foo.bar.someprogram.BlockDirt");


在您的情况下,可能需要这样的东西。

Class<? extends Block> myClass = Class.forName(myPackageName + blockNameConverted);





  Cannot cast java.lang.Class to block.Block


您正在将类本身强制转换为Block。它不是Block。只能将Block的实例强制转换为Block。使用myClass.newInstance()创建该类的新实例。请记住,该类的构造函数必须没有参数,此方法才能正常工作。如果要使用多参数构造函数,可以执行myClass.getConstructor(someParameters).newInstance(someArguments)

例:

假设您的课程有一个构造函数,其签名为BlockDirt(String name, int someNumber)

要使用带有反射的此构造函数创建新实例,请执行以下操作:

Block block = myClass.getConstructor(String.class, int.class).newInstance("Foo", 42);




请记住,您需要包名称才能进行反射。如果知道它可能包含在哪些软件包中,则可以使用Jon Skeet's answer here

10-04 15:50