Skip to content

Commit f98cbd5

Browse files
committed
[1.7.0-feature] 代码优化
1 parent 7912110 commit f98cbd5

File tree

9 files changed

+128
-38
lines changed

9 files changed

+128
-38
lines changed

lib_bytecode/src/main/java/org/ninetripods/lib_bytecode/asm/AClassVisitor.kt

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,35 @@ package org.ninetripods.lib_bytecode.asm
22

33
import org.objectweb.asm.*
44

5+
/**
6+
* use[#org.ninetripods.mq.study.customView.alipayView.AlipayView]
7+
find class: AlipayView.class
8+
visit(52,4128,org/ninetripods/mq/study/customView/alipayView/AlipayView$1:java/lang/Object,null,[Ljava.lang.String;@4ab48b2b)
9+
visitSource(AlipayView.java, null)
10+
visitOuterClass(org/ninetripods/mq/study/customView/alipayView/AlipayView, null, null)
11+
visitInnerClass(org/ninetripods/mq/study/customView/alipayView/AlipayView$1, null, null, 4104)
12+
visitInnerClass(org/ninetripods/mq/study/customView/alipayView/AlipayView$State, org/ninetripods/mq/study/customView/alipayView/AlipayView, State, 16408)
13+
visitField(4120,$SwitchMap$org$ninetripods$mq$study$customView$alipayView$AlipayView$State, [I, null, null)
14+
visitMethod(8, <clinit>, ()V, null, null)
15+
CustomMethodVisitor: visitInsn opcode 190
16+
CustomMethodVisitor: visitInsn opcode 4
17+
CustomMethodVisitor: visitInsn opcode 79
18+
CustomMethodVisitor: visitInsn opcode 5
19+
CustomMethodVisitor: visitInsn opcode 79
20+
CustomMethodVisitor: visitInsn opcode 6
21+
CustomMethodVisitor: visitInsn opcode 79
22+
CustomMethodVisitor: visitInsn opcode 177
23+
visitEnd()
24+
*/
525
class AClassVisitor(api: Int, classVisitor: ClassVisitor? = null) :
626
ClassVisitor(api, classVisitor) {
727

828
/**
29+
* 如:visit(52,4128,org/ninetripods/mq/study/customView/alipayView/AlipayView$1:java/lang/Object,null,[Ljava.lang.String;@4ab48b2b)
930
* @param version JDK版本 例如返回52,代表是是JDK1.8
10-
* @param access
31+
* @param access 修饰字段 如:Opcodes.ACC_PUBLIC + Opcodes.ACC_ABSTRACT + Opcodes.ACC_INTERFACE
1132
* @param name 类名
12-
* @param signature
33+
* @param signature 泛型
1334
* @param superName 父类名
1435
* @param interfaces
1536
*/
@@ -21,11 +42,12 @@ class AClassVisitor(api: Int, classVisitor: ClassVisitor? = null) :
2142
superName: String?,
2243
interfaces: Array<out String>?,
2344
) {
24-
println("visit($version,$access,$name:$superName,$signature,$interfaces)")
45+
println("visit($version,$access,$name,$superName,$signature,$interfaces)")
2546
super.visit(version, access, name, signature, superName, interfaces)
2647
}
2748

2849
/**
50+
* 如:visitSource(AlipayView.java, null)
2951
* @param source
3052
* @param debug
3153
*/
@@ -35,6 +57,7 @@ class AClassVisitor(api: Int, classVisitor: ClassVisitor? = null) :
3557
}
3658

3759
/**
60+
* 如:visitOuterClass(org/ninetripods/mq/study/customView/alipayView/AlipayView, null, null)
3861
* @param owner
3962
* @param name
4063
* @param descriptor
@@ -63,6 +86,8 @@ class AClassVisitor(api: Int, classVisitor: ClassVisitor? = null) :
6386
}
6487

6588
/**
89+
* 如:visitInnerClass(org/ninetripods/mq/study/customView/alipayView/AlipayView$1, null, null, 4104)
90+
* visitInnerClass(org/ninetripods/mq/study/customView/alipayView/AlipayView$State, org/ninetripods/mq/study/customView/alipayView/AlipayView, State, 16408)
6691
* @param name
6792
* @param outerName
6893
* @param innerName
@@ -79,6 +104,7 @@ class AClassVisitor(api: Int, classVisitor: ClassVisitor? = null) :
79104
}
80105

81106
/**
107+
* 如:visitField(4120,$SwitchMap$org$ninetripods$mq$study$customView$alipayView$AlipayView$State, [I, null, null)
82108
* @param access
83109
* @param name
84110
* @param descriptor
@@ -93,11 +119,12 @@ class AClassVisitor(api: Int, classVisitor: ClassVisitor? = null) :
93119
signature: String?,
94120
value: Any?,
95121
): FieldVisitor {
96-
println("visitField($access,$name, $descriptor, $signature, $value)")
122+
println("visitField($access,$name,$descriptor,$signature,$value)")
97123
return super.visitField(access, name, descriptor, signature, value)
98124
}
99125

100126
/**
127+
* 如:visitMethod(8, <clinit>, ()V, null, null)
101128
* @param access
102129
* @param name
103130
* @param descriptor

lib_bytecode/src/main/java/org/ninetripods/lib_bytecode/asm/AMethodVisitor.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,17 @@ class C {
1717
}
1818
}
1919

20-
class CustomMethodVisitor(var api: Int, var mv: MethodVisitor) : MethodVisitor(api, mv) {
20+
/**
21+
CustomMethodVisitor: visitInsn opcode 190
22+
CustomMethodVisitor: visitInsn opcode 4
23+
CustomMethodVisitor: visitInsn opcode 79
24+
CustomMethodVisitor: visitInsn opcode 5
25+
CustomMethodVisitor: visitInsn opcode 79
26+
CustomMethodVisitor: visitInsn opcode 6
27+
CustomMethodVisitor: visitInsn opcode 79
28+
CustomMethodVisitor: visitInsn opcode 177
29+
*/
30+
class CustomMethodVisitor(api: Int, mv: MethodVisitor) : MethodVisitor(api, mv) {
2131

2232
override fun visitCode() {
2333
mv.visitCode()

lib_bytecode/src/main/java/org/ninetripods/lib_bytecode/asm/MethodTimeCostTest1.java

Lines changed: 0 additions & 13 deletions
This file was deleted.

lib_bytecode/src/main/java/org/ninetripods/lib_bytecode/asm/AAdviceAdapter.kt renamed to lib_bytecode/src/main/java/org/ninetripods/lib_bytecode/asm/demo/AAdviceAdapter.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//package org.ninetripods.lib_bytecode.asm
22
//
33
//import org.ninetripods.lib_bytecode.BConstant
4-
//import org.ninetripods.lib_bytecode.MethodTimeCostTest
4+
//import org.ninetripods.lib_bytecode.asm.demo.MethodTimeCostTest
55
//import org.ninetripods.lib_bytecode.log
66
//import org.ninetripods.lib_bytecode.util.Loader
77
//import org.ninetripods.lib_bytecode.util.decodeAcc

lib_bytecode/src/main/java/org/ninetripods/lib_bytecode/asm/AExecutor.java renamed to lib_bytecode/src/main/java/org/ninetripods/lib_bytecode/asm/demo/AExecutor.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,32 @@
1-
package org.ninetripods.lib_bytecode.asm;
1+
package org.ninetripods.lib_bytecode.asm.demo;
2+
3+
import static org.ninetripods.lib_bytecode.BConstantKt.log;
4+
import static org.ninetripods.lib_bytecode.asm.demo.ATimeCostClassVisitorKt.FIELD_NAME_ADD;
25

36
import org.ninetripods.lib_bytecode.BConstant;
4-
import org.ninetripods.lib_bytecode.MethodTimeCostTest;
57
import org.ninetripods.lib_bytecode.util.Loader;
68
import org.objectweb.asm.ClassReader;
79
import org.objectweb.asm.ClassVisitor;
810
import org.objectweb.asm.ClassWriter;
911

1012
import java.io.IOException;
11-
12-
import static org.ninetripods.lib_bytecode.BConstantKt.log;
13-
import static org.ninetripods.lib_bytecode.asm.AddTimeCostVisitorKt.FIELD_NAME_ADD;
13+
import java.util.Arrays;
1414

1515
public class AExecutor {
1616

1717
public static void main(String[] args) {
1818
try {
1919
ClassReader classReader = new ClassReader(MethodTimeCostTest.class.getName());
2020
ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS);
21-
ClassVisitor classVisitor = new AddTimeCostVisitor(BConstant.ASM9, classWriter);
21+
ClassVisitor classVisitor = new ATimeCostClassVisitor(BConstant.ASM9, classWriter);
2222
classReader.accept(classVisitor, ClassReader.EXPAND_FRAMES);
2323

2424
Loader loader = new Loader();
2525
try {
26+
log("classWriter ByteArray: " + Arrays.toString(classWriter.toByteArray()));
2627
Class addTimeClass = loader.defineClass(MethodTimeCostTest.class.getName(), classWriter.toByteArray());
2728
Object instance = addTimeClass.newInstance();
28-
addTimeClass.getDeclaredMethod("addTimeCostMonitor").invoke(addTimeClass);
29+
addTimeClass.getDeclaredMethod("addTimeCostMonitor").invoke(instance);
2930
Long timeCost = addTimeClass.getDeclaredField(FIELD_NAME_ADD).getLong(instance);
3031
log("timeCost:" + timeCost);
3132
} catch (Exception e) {

lib_bytecode/src/main/java/org/ninetripods/lib_bytecode/asm/AddTimeCostVisitor.kt renamed to lib_bytecode/src/main/java/org/ninetripods/lib_bytecode/asm/demo/ATimeCostClassVisitor.kt

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.ninetripods.lib_bytecode.asm
1+
package org.ninetripods.lib_bytecode.asm.demo
22

33
import org.ninetripods.lib_bytecode.log
44
import org.ninetripods.lib_bytecode.util.decodeAcc
@@ -10,11 +10,42 @@ import org.objectweb.asm.commons.AdviceAdapter
1010

1111
const val FIELD_NAME_ADD: String = "timeCost" //新增属性名称
1212

13-
class AddTimeCostVisitor(api: Int, classVisitor: ClassVisitor) :
13+
/**
14+
* 方法耗时统计
15+
* @param api
16+
* @param classVisitor
17+
visit(): owner-org/ninetripods/lib_bytecode/asm/demo/MethodTimeCostTest
18+
visitMethod(): access-ACC_PUBLIC , name-<init>, descriptor-()V, signature-null, exceptions-null
19+
visitMethod(): access-ACC_PUBLIC ACC_FINAL , name-getTimeCost, descriptor-()J, signature-null, exceptions-null
20+
onMethodEnter():
21+
visitFieldInsn(): opcode-180, owner-org/ninetripods/lib_bytecode/asm/demo/MethodTimeCostTest, name-timeCost, descriptor-J
22+
onMethodExit(): opcode-LRETURN
23+
visitMethod(): access-ACC_PUBLIC ACC_FINAL , name-setTimeCost, descriptor-(J)V, signature-null, exceptions-null
24+
onMethodEnter():
25+
visitFieldInsn(): opcode-181, owner-org/ninetripods/lib_bytecode/asm/demo/MethodTimeCostTest, name-timeCost, descriptor-J
26+
onMethodExit(): opcode-RETURN
27+
visitMethod(): access-ACC_PUBLIC ACC_FINAL , name-addTimeCostMonitor, descriptor-()V, signature-null, exceptions-null
28+
onMethodEnter():
29+
visitFieldInsn(): opcode-181, owner-org/ninetripods/lib_bytecode/asm/demo/MethodTimeCostTest, name-timeCost, descriptor-J
30+
visitFieldInsn(): opcode-180, owner-org/ninetripods/lib_bytecode/asm/demo/MethodTimeCostTest, name-timeCost, descriptor-J
31+
visitFieldInsn(): opcode-178, owner-java/lang/System, name-out, descriptor-Ljava/io/PrintStream;
32+
onMethodExit(): opcode-RETURN
33+
visitEnd():
34+
*/
35+
class ATimeCostClassVisitor(api: Int, classVisitor: ClassVisitor) :
1436
ClassVisitor(api, classVisitor) {
1537

1638
private var owner = ""
1739

40+
/**
41+
* 如:visit(): owner-org/ninetripods/lib_bytecode/asm/demo/MethodTimeCostTest
42+
* @param version
43+
* @param access
44+
* @param name
45+
* @param signature
46+
* @param superName
47+
* @param interfaces
48+
*/
1849
override fun visit(
1950
version: Int,
2051
access: Int,
@@ -24,7 +55,7 @@ class AddTimeCostVisitor(api: Int, classVisitor: ClassVisitor) :
2455
interfaces: Array<out String>?,
2556
) {
2657
this.owner = name ?: ""
27-
log("visit(): owner-$owner")
58+
//log("visit(): owner-$owner")
2859
super.visit(version, access, name, signature, superName, interfaces)
2960
}
3061

@@ -47,7 +78,7 @@ class AddTimeCostVisitor(api: Int, classVisitor: ClassVisitor) :
4778
}
4879

4980
override fun visitEnd() {
50-
log("visitEnd():")
81+
//log("visitEnd():")
5182
if (cv != null) {
5283
val fieldVisitor = cv.visitField(
5384
Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, FIELD_NAME_ADD, "J", null, null)

lib_bytecode/src/main/java/org/ninetripods/lib_bytecode/MethodTimeCostTest.kt renamed to lib_bytecode/src/main/java/org/ninetripods/lib_bytecode/asm/demo/MethodTimeCostTest.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
package org.ninetripods.lib_bytecode
1+
package org.ninetripods.lib_bytecode.asm.demo
22

33
class MethodTimeCostTest {
44

55
fun addTimeCostMonitor() {
6-
var aaa = 10
76
Thread.sleep(1000)
87
}
98

lib_bytecode/src/main/java/org/ninetripods/lib_bytecode/asm/ASMTest.kt renamed to lib_bytecode/src/main/java/org/ninetripods/lib_bytecode/asm/demo/ProduceClz.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
1-
package org.ninetripods.lib_bytecode.asm
1+
package org.ninetripods.lib_bytecode.asm.demo
22

3+
import org.ninetripods.lib_bytecode.asm.AClassVisitor
4+
import org.ninetripods.lib_bytecode.util.FileUtil
35
import org.objectweb.asm.ClassReader
46
import org.objectweb.asm.ClassWriter
5-
import org.objectweb.asm.Opcodes
67
import org.objectweb.asm.Opcodes.*
78

89
/**
910
* ASM使用示例
1011
*/
11-
object ASMTest {
12+
object ProduceClz {
1213

1314
@JvmStatic
1415
fun main(args: Array<String>) {
1516
println("ASM示例")
1617
val classReader = ClassReader("java.lang.Runnable")
17-
val classVisitor = AClassVisitor(Opcodes.ASM9, ClassWriter(ClassWriter.COMPUTE_MAXS))
18+
val classVisitor = AClassVisitor(ASM9, ClassWriter(ClassWriter.COMPUTE_MAXS))
1819
classReader.accept(classVisitor, ClassReader.EXPAND_FRAMES)
1920
produceClass()
2021
}
@@ -45,7 +46,6 @@ object ASMTest {
4546
cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT, "compareTo",
4647
"(Ljava/lang/Object;)I", null, null).visitEnd()
4748
cw.visitEnd()
48-
val b = cw.toByteArray()
49-
println(b.toString())
49+
FileUtil.byte2File("AndroidStudy/build/demo/GenerAuto.java",cw.toByteArray())
5050
}
5151
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package org.ninetripods.lib_bytecode.util
2+
3+
import java.io.ByteArrayInputStream
4+
import java.io.File
5+
import java.io.FileOutputStream
6+
7+
/**
8+
* Created by mq on 2023/2/7
9+
*/
10+
object FileUtil {
11+
12+
fun byte2File(outputPath: String, sourceByte: ByteArray) {
13+
try {
14+
val file = File(outputPath)
15+
if (file.exists()) {
16+
file.delete()
17+
} else {
18+
file.createNewFile()
19+
}
20+
21+
val inputStream = ByteArrayInputStream(sourceByte)
22+
val outputStream = FileOutputStream(file)
23+
val buffer = ByteArray(1024)
24+
var len = 0
25+
while (inputStream.read(buffer).apply { len = this } != -1) {
26+
outputStream.write(buffer, 0, len)
27+
}
28+
outputStream.flush()
29+
outputStream.close()
30+
inputStream.close()
31+
} catch (ex: Exception) {
32+
ex.printStackTrace()
33+
}
34+
}
35+
}

0 commit comments

Comments
 (0)