Heim  >  Artikel  >  Java  >  Eine kurze Analyse der Methode zum Betrieb von Bytecode im Java-Bytecode-Framework ASM

Eine kurze Analyse der Methode zum Betrieb von Bytecode im Java-Bytecode-Framework ASM

高洛峰
高洛峰Original
2017-01-23 10:23:511737Durchsuche

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

Eine kurze Analyse der Methode zum Betrieb von Bytecode im Java-Bytecode-Framework ASM

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn