Heim > Java > javaLernprogramm > Hauptteil

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

高洛峰
Freigeben: 2017-01-23 10:23:51
Original
1703 Leute haben es durchsucht

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);
Nach dem Login kopieren

und die entsprechende Typsignatur ist

f (ILjava/lang/String;[I)J
Nach dem Login kopieren

Wenn die Java-Methode beispielsweise

private void hi(double a, List<String> b);
Nach dem Login kopieren

ist, lautet die entsprechende Typsignatur

hi (DLjava/util/List;)V
Nach dem Login kopieren

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);
 }
 }
 
}
Nach dem Login kopieren

Der endgültige gedruckte Inhalt:

java/lang/Object Test$Bazhang
<init> ()V
f (ILjava/lang/String;[I)J
hi (DLjava/util/List;)V
Nach dem Login kopieren

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){
  
}
Nach dem Login kopieren

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();
 
}
Nach dem Login kopieren

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) {
 }
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!