搜索特定类并将其返回

时间:2017-01-21 19:37:49

标签: java class casting

我有一个返回(在我的情况下)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();相同的结果,但我不能直接在我的代码中输入这个,因为后来我也想创建其他块而不想每次都获取id BlockDirt

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

1 个答案:

答案 0 :(得分:3)

  

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