gpt4 book ai didi

java - 搜索特定的类并返回它

转载 作者:行者123 更新时间:2023-12-01 21:08:29 27 4
gpt4 key购买 nike

我有一个函数返回(在我的例子中)一个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)

我做错了什么?

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

使用 Block blockClass = Block.class.cast(clas); 我想得到与 Block blockClass = new BlockDirt(); 相同的结果,但我不能直接在我的代码中输入此内容,因为稍后我还想创建其他 block ,并且不想每次都获取 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 .

关于java - 搜索特定的类并返回它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41783653/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com