Wir haben ASM bereits ausführlich vorgestellt. Freunde, die es benötigen, können hier klicken: Ausführliche Untersuchung des Java-Bytecode-Frameworks ASM
Vergleichstabelle für JVM-Typsignaturen
Zum Beispiel ist die Java-Methode
long f (int n, String s, int[] arr);
und die entsprechende Typsignatur ist
f (ILjava/lang/String;[I)J
Wenn die Java-Methode beispielsweise
private void hi(double a, List<String> b);
ist, lautet die entsprechende Typsignatur
hi (DLjava/util/List;)V
Dann können Sie verwenden ASM zur Überprüfung Sind die beiden oben genannten Arten von Signaturen korrekt:
public class Test { public static void main(String[] args) throws Exception { ClassPrinter printer = new ClassPrinter(); //读取静态内部类Bazhang ClassReader cr = new ClassReader("Test$Bazhang"); cr.accept(printer, 0); } //静态内部类 static class Bazhang { public Bazhang(int a) { } private long f (int n, String s, int[] arr){ return 0; } private void hi(double a, List<String> b){ } } static class ClassPrinter extends ClassVisitor { public ClassPrinter() { super(Opcodes.ASM5); } @Override public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { super.visit(version, access, name, signature, superName, interfaces); //打印出父类name和本类name System.out.println(superName + " " + name); } @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { //打印出方法名和类型签名 System.out.println(name + " " + desc); return super.visitMethod(access, name, desc, signature, exceptions); } } }
Der endgültige gedruckte Inhalt:
java/lang/Object Test$Bazhang <init> ()V f (ILjava/lang/String;[I)J hi (DLjava/util/List;)V
Die vorherige Richtigkeit wurde überprüft und Sie können sehen, dass auch der Standardkonstruktor gedruckt wird.
Dann machen wir als nächstes etwas Interessantes zur Bazhang-Klasse:
public void newFunc(String str){ }
Sie müssen es zu diesem Zeitpunkt verwenden ClassWriter wird zum Zusammenfügen von Bytecode verwendet. Spezifische Artikel zu ClassReader, ClassVisitor und ClassWriter finden Sie in diesem Artikel: Detaillierte Erklärung von ClassReader, ClassVisitor und ClassWriter für das ASM-Quellcode-Lernen
public static void main(String[] args) throws Exception { ClassReader cr = new ClassReader(Bazhang.class.getName()); ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS); cr.accept(cw, Opcodes.ASM5); MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "newFunc", "(Ljava/lang/String;)V", null, null); mv.visitInsn(Opcodes.RETURN); mv.visitEnd(); // 获取生成的class文件对应的二进制流 byte[] code = cw.toByteArray(); //将二进制流写到out/下 FileOutputStream fos = new FileOutputStream("out/Bazhang222.class"); fos.write(code); fos.close(); }
Dadurch wird Bazhang222.class im Ordner out/ generiert:
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // import java.util.List; class Test$Bazhang { Test$Bazhang() { } private long f(int n, String s, int[] arr) { return 0L; } private void hi(double a, List<String> b) { } public void newFunc(String var1) { } }
Kombiniert mit dem zuvor organisierten JVM-Befehlssatz , verwenden Es ist für ASM kein Problem, Bytecode direkt zu bedienen. Am Ende ist die Download-Adresse des ASM-Quellcodes angehängt: http://forge.ow2.org/projects/asm/
Zusammenfassung
Das ist alles. Ich hoffe, dass der Inhalt dieses Artikels für das Studium oder die Arbeit von Nutzen sein kann. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen.
Weitere verwandte Artikel zur Bytecode-Betriebsmethode des Java-Bytecode-Frameworks ASM finden Sie auf der chinesischen PHP-Website!