我有一个返回(在我的情况下)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
答案 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。