2017-03-20 4 views
-2

最近、私はいくつかのReflectionをコーディングし始めました。クラスを取得するときにこの問題が発生します。基本的にタイトルはそれをすべて言っています:私のIDE(IntelliJ IDEA)は私がこのように作成しているクラスを言っています: クラスmyClass = aMethod.invoke(anObject); は(明らかに)クラスにキャストされる必要があります。私はそれをやってすぐにClassCastExceptionをスローしました。実際のクラスはjava.lang.Classにキャストできません。 編集:私は、Minecraftサーバープラグインを作成するためにBukkitをコーディングしています。バージョンベースであるが、反射を介して何でも得ることができるより内部的なAPIであるNMS(Net Minecraft Server)にアクセスしようとしていますあなたはそれを一つのバージョンのために独特にしたいと思っています)。Java Reflections。 IDEではjava.lang.Classにキャストする必要があると言われていますが、ClassCastExceptionをスローします。

static void setName(Player player, String name) { 
 
     try { 
 
      Method getHandle = player.getClass().getMethod("getHandle"); 
 
     Object entityPlayer = getHandle.invoke(player); 
 
     Field bS = entityPlayer.getClass().getDeclaredField("bS"); 
 
     Object gameProfile = bS.get(entityPlayer); 
 
     Field nameField = gameProfile.getClass().getDeclaredField("name"); 
 
     nameField.set(gameProfile, name); 
 
     } catch (NoSuchMethodException e) { 
 
      e.printStackTrace(); 
 
      Main.getInstance().getLogger().log(Level.SEVERE, "Could not find method: ", e); 
 
     } catch (ClassNotFoundException e) { 
 
      e.printStackTrace(); 
 
      Main.getInstance().getLogger().log(Level.SEVERE, "Could not find class: ", e); 
 
     } catch (IllegalAccessException e) { 
 
      e.printStackTrace(); 
 
      Main.getInstance().getLogger().log(Level.SEVERE, "Could not access reflection: ", e); 
 
     } catch (InvocationTargetException e) { 
 
      e.printStackTrace(); 
 
      Main.getInstance().getLogger().log(Level.SEVERE, "Could not invoke method: ", e); 
 
     } catch (NoSuchFieldException e) { 
 
      e.printStackTrace(); 
 
      Main.getInstance().getLogger().log(Level.SEVERE, "Could not find field: ", e); 
 
     } 
 
    }

あなたは私が、私はそれを直接指定してきたように、プレイヤオブジェクトにgetHandleメソッドを呼び出す見ることができますが、バージョンベースではない、方法: は、ここではいくつかのより多くのコードです実際にはCraftPlayerというクラスに属していますが、nmsの一部ではありませんが、これもバージョンベースです。また、あなたはコードを通して無意味かもしれないいくつかの試みを見るかもしれません。

Caused by: java.lang.ClassCastException: net.minecraft.server.v1_11_R1.EntityPlayer cannot be cast to java.lang.Cl 

編集: エラーは基本的にこれで私はその周りに、今日いくつかのより多くのテストを行って、コードの多くの部分を変更した、今回のエラーは私のsetNameメソッドが呼び出されるたびないNoSuchFieldExceptionがオンにキャッチされていることですフィールド "bS"は、私は完全にそれが存在すると確信しています。基本的には、そのフィールドは実際にEntityHumanという別のクラスにありますが、EntityPlayerクラスはそれを拡張します。 entityPlayerオブジェクトをEntityHumanにキャストする方法を教えてください。まず、このクラス(EntityHuman)もNMSの一部です。バージョンベースなので、リフレクションを使用してアクセスしようとします。私はClass.forNameメソッドを通してそれにアクセスするかもしれませんが、私はそれでも正しく何をするのか分からないでしょう。

static void setName(Player player, String name) { 
 
    try { 
 
    Method getHandle = player.getClass().getMethod("getHandle"); 
 
    Object entityPlayer = getHandle.invoke(player); 
 
    Field bS = entityPlayer.getClass().getDeclaredField("bS"); 
 
    Object gameProfile = bS.get(entityPlayer); 
 
    Field nameField = gameProfile.getClass().getDeclaredField("name"); 
 
    nameField.set(gameProfile, name); 
 
    } catch (NoSuchMethodException e) { 
 
    e.printStackTrace(); 
 
    Main.getInstance().getLogger().log(Level.SEVERE, "Could not find method: ", e); 
 
    } catch (IllegalAccessException e) { 
 
    e.printStackTrace(); 
 
    Main.getInstance().getLogger().log(Level.SEVERE, "Could not access reflection: ", e); 
 
    } catch (InvocationTargetException e) { 
 
    e.printStackTrace(); 
 
    Main.getInstance().getLogger().log(Level.SEVERE, "Could not invoke method: ", e); 
 
    } catch (NoSuchFieldException e) { 
 
    e.printStackTrace(); 
 
    Main.getInstance().getLogger().log(Level.SEVERE, "Could not find field: ", e); 
 
    } 
 
}

+0

さて、 'Class'オブジェクトを返すと思われるメソッドはありますか?質問を編集して、実際のクラス、インスタンス、メソッドを含むいくつかのコードを提供できますか? – RealSkeptic

+0

私はそれをしました..おそらくあなたは通知されていません。 – Vert3x

+0

エラーメッセージの言い換えを投稿しないでください。メッセージ全体を投稿してください。 – EJP

答えて

1

Method.invoke(Object)戻りObject:ここでは以下の私の現在のコードです。反映されたメソッドが返す型にキャストする必要があります。 IDEが迷っている場合は、IDEを無視するか、IDEAでバグレポートを提出してください。 the docsを参照してください。

+0

これを行うと、バージョンベース(実際のクラスパッケージにはそれを含む)になるため、直接指定することはできません。 – Vert3x

関連する問題