ページ 22

Re: レシピの仕様変更でクラスの書き換えに失敗する

Posted: 2021年11月21日(日) 08:57
by おがさくら

[この返信は削除されました]


Re: レシピの仕様変更でクラスの書き換えに失敗する

Posted: 2021年11月21日(日) 22:28
by penM
おがさくら さんが書きました: 2021年11月19日(金) 20:14

スーパークラスのvisitMethodInsnに引数をそのまま入れて実行するのはできます
Type.getObjectType("net/minecraft/item/ItemStack")をType.VOID_TYPEにして呼び出すメソッドもvoid型にするのもできました。
しかし、getMethodDescriptorの第一引数にType.getObjectType("net/minecraft/item/ItemStack")を入れると起動できなくなってしまいます。

getMethodDescriptorの第一引数はreturnType - メソッドの戻りの型なのに「argumentTypes - メソッドの引数の型」を入れるのが問題なのではないでしょうか?


Re: レシピの仕様変更でクラスの書き換えに失敗する

Posted: 2021年11月24日(水) 11:13
by おがさくら

[この返信は削除されました]


Re: レシピの仕様変更でクラスの書き換えに失敗する

Posted: 2021年11月30日(火) 11:28
by penM

予想なのですが、
public static StringSE getMethodDescriptor(Type returnType,Type... argumentTypes)
におけるType returnTypeとは、

  • Type.VOID_TYPE

  • Type.SHORT_TYPE

  • Type.LONG_TYPE

  • Type.INT_TYPE

  • Type.FLOAT_TYPE

  • Type.DOUBLE_TYPE

  • Type.CHAR_TYPE

  • Type.BYTE_TYPE

  • Type.BOOLEAN_TYPE

を指しているのではないでしょうか?

この根拠としては、参考サイトに
Type.getMethodDescriptor(Type.VOID_TYPE, Type.getObjectType("net/minecraft/tileentity/TileEntity"))
の記述があるためです。

そしてType.~_TYPEは、java内部での基本タイプ(int,void,char)への単なる参照な気がします。
書き方があっているかわかりませんが、下記のように表記しても動きそうな気がします。
Type.getMethodDescriptor(void, Type.getObjectType("net/minecraft/tileentity/TileEntity"))

ここで、
Type.getObjectType
に関してですが、

getObjectType
public static Type getObjectType(StringSE internalName)
指定された内部名に対応する Type を返します。

とあります。
この関数が返すTypeとは、Type.VOID_TYPEType.の部分を返しているのではないでしょうか?

そうすると
getMethodDescriptor(Type.getObjectType("net/minecraft/item/ItemStack") , ~)
のような表記は、getMethodDescriptorにintなのか、voidなのかを渡していないことになると思います。

(java書いたこと無いので間違っていたら笑ってください :D )


Re: レシピの仕様変更でクラスの書き換えに失敗する

Posted: 2021年12月18日(土) 21:12
by おがさくら

返信遅れてすみません&ありがとうございます
これ以上は解決できそうにないので諦めることにします...