提供: Minecraft Modding Wiki
この編集を取り消せます。
下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 | 編集中の文章 | ||
1行目: | 1行目: | ||
− | このページは、ASMの利用方法をサンプルを通じて察してもらうことを目的としている。 | + | このページは、ASMの利用方法をサンプルを通じて察してもらうことを目的としている。 |
− | |||
==メソッドの単純な書き換え== | ==メソッドの単純な書き換え== | ||
ここでは、TileEntityFurnaceの書き換えをサンプルとして、メソッドの書き換えを解説する。<br/> | ここでは、TileEntityFurnaceの書き換えをサンプルとして、メソッドの書き換えを解説する。<br/> | ||
+ | ただし[[Coremodsの基礎]]や[[1.7のクラス書き換え]]に含まれている解説はここでは省略する。<br/> | ||
今回の例ではかまどで焼きあがるまでの時間を200(棒2つ分)から400(棒4つ分)に変更する。 | 今回の例ではかまどで焼きあがるまでの時間を200(棒2つ分)から400(棒4つ分)に変更する。 | ||
===ソースコード=== | ===ソースコード=== | ||
*SampleTransformer.java | *SampleTransformer.java | ||
<source lang = "java"> | <source lang = "java"> | ||
− | + | import net.minecraft.launchwrapper.IClassTransformer; | |
+ | import net.minecraftforge.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper; | ||
+ | import org.objectweb.asm.ClassReader; | ||
+ | import org.objectweb.asm.ClassVisitor; | ||
+ | import org.objectweb.asm.ClassWriter; | ||
+ | import org.objectweb.asm.Type; | ||
public class SampleTransformer implements IClassTransformer{ | public class SampleTransformer implements IClassTransformer{ | ||
67行目: | 72行目: | ||
下手なクラスをここに入れようとするとまずいので確信がない限りStringで入れるべき。 | 下手なクラスをここに入れようとするとまずいので確信がない限りStringで入れるべき。 | ||
− | @param returnType {@link String}型か、{@link Class} | + | @param returnType {@link String}型か、{@link Class}型を入れる。 |
− | @param rawDesc {@link String}型か、{@link Class} | + | @param rawDesc {@link String}型か、{@link Class}型を入れる。 |
@throws IllegalArgumentException 引数に{@link String}型か、{@link Class}型以外が入ったら投げられる。 | @throws IllegalArgumentException 引数に{@link String}型か、{@link Class}型以外が入ったら投げられる。 | ||
− | |||
*/ | */ | ||
public static String toDesc(Object returnType,Object... rawDesc){ | public static String toDesc(Object returnType,Object... rawDesc){ | ||
86行目: | 90行目: | ||
下手なクラスをここに入れようとするとまずいので確信がない限りStringで入れるべき。 | 下手なクラスをここに入れようとするとまずいので確信がない限りStringで入れるべき。 | ||
− | @param raw {@link String} | + | @param raw {@link String}型か、プリミティブの{@link Class}型を入れる。 |
@throws IllegalArgumentException {@param raw}に{@link String}型か、{@link Class}型以外が入ったら投げられる。 | @throws IllegalArgumentException {@param raw}に{@link String}型か、{@link Class}型以外が入ったら投げられる。 | ||
− | |||
*/ | */ | ||
public static String toDesc(Object raw){ | public static String toDesc(Object raw){ | ||
107行目: | 110行目: | ||
*SampleAdapter.java | *SampleAdapter.java | ||
<source lang = "java"> | <source lang = "java"> | ||
− | + | import org.objectweb.asm.ClassVisitor; | |
+ | import org.objectweb.asm.MethodVisitor; | ||
+ | import org.objectweb.asm.Opcodes; | ||
+ | import org.objectweb.asm.Type; | ||
+ | |||
+ | import static com.mods.kina.asm.SampleTransformer.*; | ||
+ | import static org.objectweb.asm.Opcodes.*; | ||
public class SampleAdapter{ | public class SampleAdapter{ | ||
161行目: | 170行目: | ||
} | } | ||
</source> | </source> | ||
− | |||
===解説=== | ===解説=== | ||
====SampleTransformer.java==== | ====SampleTransformer.java==== | ||
239行目: | 247行目: | ||
</source> | </source> | ||
; super.visitVarInsn(ALOAD, 1); | ; super.visitVarInsn(ALOAD, 1); | ||
− | : | + | : スタックに引数1をスタックに積む。(ALOAD 0はthisが入っている。) |
; super.visitMethodInsn(INVOKESTATIC, "SampleHooks", "totalCookTime", SampleTransformer.toDesc(int.class, "net.minecraft.item.ItemStack"), false); | ; super.visitMethodInsn(INVOKESTATIC, "SampleHooks", "totalCookTime", SampleTransformer.toDesc(int.class, "net.minecraft.item.ItemStack"), false); | ||
: 用意したメソッドを呼ぶ。 | : 用意したメソッドを呼ぶ。 | ||
251行目: | 259行目: | ||
(書いている途中ですが、上で説明したのを応用すればなんとかなると思います。) | (書いている途中ですが、上で説明したのを応用すればなんとかなると思います。) | ||
==その他== | ==その他== | ||
− | |||
− | |||
− | |||
− | |||
− | |||
==参考== | ==参考== | ||
− | [http://asm.ow2.org/ ASM公式] | + | [[http://asm.ow2.org/ ASM公式]] |
− | [https://ja.wikipedia.org/wiki/Java%E3%83%90%E3%82%A4%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89 Javaバイトコード] | + | [[https://ja.wikipedia.org/wiki/Java%E3%83%90%E3%82%A4%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89 Javaバイトコード]] |