1717
1818import javax .swing .*;
1919import java .awt .*;
20+ import java .awt .event .KeyAdapter ;
21+ import java .awt .event .KeyEvent ;
2022import java .io .File ;
2123import java .io .PrintWriter ;
2224import java .io .StringWriter ;
@@ -40,41 +42,58 @@ public ASMifierTablePanel(ClassNode classNode) {
4042 codeArea .setText (trim .substring (0 , trim .lastIndexOf ("\n " )));
4143 codeArea .setCaretPosition (0 );
4244 });
43- add (new RTextScrollPane (codeArea ));
44- add (BorderLayout .SOUTH , new JPanel () {{
45- add (new JButton ("Save" ) {{
46- addActionListener (e -> {
47- try {
48- StringWriter stringWriter = new StringWriter ();
49- ClassReader classReader = new ClassReader (this .getClass ().getName ());
50- classReader .accept (new TraceClassVisitor (null , new ASMifier (), new PrintWriter (stringWriter )), 0 );
51- ClassPool classPool = new ClassPool ();
52- classPool .appendSystemPath ();
53- classPool .importPackage ("org.objectweb.asm.AnnotationVisitor" );
54- classPool .importPackage ("org.objectweb.asm.Attribute" );
55- classPool .importPackage ("org.objectweb.asm.ClassReader" );
56- classPool .importPackage ("org.objectweb.asm.ClassWriter" );
57- classPool .importPackage ("org.objectweb.asm.ConstantDynamic" );
58- classPool .importPackage ("org.objectweb.asm.FieldVisitor" );
59- classPool .importPackage ("org.objectweb.asm.Handle" );
60- classPool .importPackage ("org.objectweb.asm.Label" );
61- classPool .importPackage ("org.objectweb.asm.MethodVisitor" );
62- classPool .importPackage ("org.objectweb.asm.Opcodes" );
63- classPool .importPackage ("org.objectweb.asm.RecordComponentVisitor" );
64- classPool .importPackage ("org.objectweb.asm.Type" );
65- classPool .importPackage ("org.objectweb.asm.TypePath" );
66- CtClass ctClass = classPool .makeClass (ASMifier .class .getSimpleName ());
67- ctClass .addInterface (classPool .get ("org.objectweb.asm.Opcodes" ));
68- ctClass .addMethod (CtMethod .make ("public static byte[] dump() throws Exception {" + codeArea .getText () + "return classWriter.toByteArray();}" , ctClass ));
69- byte [] dumps = (byte []) new Loader (classPool ).loadClass (ASMifier .class .getSimpleName ()).getMethod ("dump" ).invoke (null );
70- ClassNode newClassNode = new ClassNode ();
71- new ClassReader (dumps ).accept (newClassNode , ClassReader .EXPAND_FRAMES );
72- JavaOctetEditor .getInstance ().jar .classes .put (newClassNode .name + ".class" , newClassNode );
73- } catch (Throwable ex ) {
74- throw new RuntimeException (ex );
45+ add (new RTextScrollPane (codeArea ) {{
46+ getTextArea ().addKeyListener (new KeyAdapter () {
47+
48+ boolean control = false ;
49+
50+ @ Override
51+ public void keyPressed (KeyEvent e ) {
52+ if (e .getKeyCode () == KeyEvent .VK_CONTROL ) {
53+ control = true ;
54+ } else if (e .getKeyCode () == KeyEvent .VK_S ) {
55+ if (control ) {
56+ try {
57+ StringWriter stringWriter = new StringWriter ();
58+ ClassReader classReader = new ClassReader (this .getClass ().getName ());
59+ classReader .accept (new TraceClassVisitor (null , new ASMifier (), new PrintWriter (stringWriter )), 0 );
60+ ClassPool classPool = new ClassPool ();
61+ classPool .appendSystemPath ();
62+ classPool .importPackage ("org.objectweb.asm.AnnotationVisitor" );
63+ classPool .importPackage ("org.objectweb.asm.Attribute" );
64+ classPool .importPackage ("org.objectweb.asm.ClassReader" );
65+ classPool .importPackage ("org.objectweb.asm.ClassWriter" );
66+ classPool .importPackage ("org.objectweb.asm.ConstantDynamic" );
67+ classPool .importPackage ("org.objectweb.asm.FieldVisitor" );
68+ classPool .importPackage ("org.objectweb.asm.Handle" );
69+ classPool .importPackage ("org.objectweb.asm.Label" );
70+ classPool .importPackage ("org.objectweb.asm.MethodVisitor" );
71+ classPool .importPackage ("org.objectweb.asm.Opcodes" );
72+ classPool .importPackage ("org.objectweb.asm.RecordComponentVisitor" );
73+ classPool .importPackage ("org.objectweb.asm.Type" );
74+ classPool .importPackage ("org.objectweb.asm.TypePath" );
75+ CtClass ctClass = classPool .makeClass (ASMifier .class .getSimpleName ());
76+ ctClass .addInterface (classPool .get ("org.objectweb.asm.Opcodes" ));
77+ ctClass .addMethod (CtMethod .make ("public static byte[] dump() throws Exception {" + codeArea .getText () + "return classWriter.toByteArray();}" , ctClass ));
78+ byte [] dumps = (byte []) new Loader (classPool ).loadClass (ASMifier .class .getSimpleName ()).getMethod ("dump" ).invoke (null );
79+ ClassNode newClassNode = new ClassNode ();
80+ new ClassReader (dumps ).accept (newClassNode , ClassReader .EXPAND_FRAMES );
81+ JavaOctetEditor .getInstance ().jar .classes .put (newClassNode .name + ".class" , newClassNode );
82+ JOptionPane .showMessageDialog (null , "Save Success" );
83+ } catch (Throwable ex ) {
84+ throw new RuntimeException (ex );
85+ }
86+ }
87+ }
88+ }
89+
90+ @ Override
91+ public void keyReleased (KeyEvent e ) {
92+ if (e .getKeyCode () == KeyEvent .VK_CONTROL ) {
93+ control = false ;
7594 }
76- });
77- }} );
95+ }
96+ });
7897 }});
7998 }
8099
0 commit comments