2017-01-21 11 views
0

私の場合はBlockを返す関数を持っています。 blockNameという名前の文字列を使用していますが、その値は「汚れ」に設定されます。 その後、blockNameConvertedという名前の新しい文字列を作成しています。これはBlockDirtになり、私はまた、クラスBlockDirtを持っている(それは同じパッケージではありません):特定のクラスを検索して返します

:私は clas = Class.forName(blockNameConverted);クラス 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; 
} 

しかし、私はこのエラーを取得しています。このメソッドを呼び出すとき

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

+1

あなたはそのクラス自体をブロックにキャストしています。これはブロックではありません。 'clas.newInstance()'を使ってクラスの新しいインスタンスを作成します。 – Moira

+2

最初の例外は単に、コードを実行するJVMのクラスパスでBlockDirtクラスが** not **であることを意味します。 – GhostCat

+1

2つの異なるエラー、2つの別々の問題:1) 'ClassNotFoundException':あなたのクラスパスが間違っている、そして/またはあなたが正しいクラス名を指定していない、2)' ClassCastException':* CLASS INSTANCE OF BLOCK * "Class"オブジェクトではない – paulsm4

答えて

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を使用できます。

+0

ありがとう!私は " - >パッケージ名を忘れました。 "BlockNameConverted"を設定したときに< - BlockDirt "を返し、もう1つを' Block block = clas.getInstance(); 'に変更しました。 –

関連する問題