Skip to content

Commit

Permalink
test(core.transform-kit): 测试filterRefClasses方法
Browse files Browse the repository at this point in the history
测试Transform时如果想修改一个对象方法调用时,
如果这个方法来自于其父类,是否可以通过过来父类来找出需要修改的类,
以便优化Transform速度。结论是不行,直接调用父类方法时并不需要引用父类。
  • Loading branch information
shifujun committed Jun 7, 2022
1 parent 2f0e104 commit b33a8a7
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -43,16 +43,6 @@ abstract class SpecificTransform {
methodInfo.descriptor = other.methodInfo.descriptor
}

/**
* 过滤引用了某些类型的类
*/
fun filterRefClasses(allAppClass: Set<CtClass>, targetClassList: List<String>) =
allAppClass.filter { ctClass ->
targetClassList.any { targetClass ->
ctClass.refClasses.contains(targetClass)
}
}.toSet()

fun CtClass.isClassOf(className: String): Boolean {
var tmp: CtClass? = this
do {
Expand Down Expand Up @@ -136,4 +126,16 @@ abstract class SpecificTransform {

return false
}

companion object {
/**
* 过滤引用了某些类型的类
*/
fun filterRefClasses(allAppClass: Set<CtClass>, targetClassList: List<String>) =
allAppClass.filter { ctClass ->
targetClassList.any { targetClass ->
ctClass.refClasses.contains(targetClass)
}
}.toSet()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ class SuperSuper {
protected void ss1() {

}

final protected void methodCannotOverride() {

}
}

class Super extends SuperSuper {
Expand Down Expand Up @@ -68,3 +72,14 @@ protected void s2(Arg arg) {
super.s2(arg);
}
}

/**
* 这个类通过Foo类型调用其父类SuperSuper类型的方法,
* 所以这个类本身并没有引用SuperSuper类型。
*/
class UseFooAsSuperSuper {
void useFooAsSuperSuper() {
Foo foo = new Foo();
foo.methodCannotOverride();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.tencent.shadow.core.transform_kit

import org.junit.Assert
import org.junit.Test

class FilterRefClassesTest : AbstractTransformTest() {


/**
* 测试Transform时如果想修改一个对象方法调用时,
* 如果这个方法来自于其父类,是否可以通过过来父类来找出需要修改的类,
* 以便优化Transform速度。
* 结论是不行,直接调用父类方法时并不需要引用父类。
*/
@Test
fun testCallSuperMethodWithoutSuperClass() {
val targetClass = sLoader["test.override.UseFooAsSuperSuper"]

val allAppClass = setOf(targetClass)
val filterRefClasses =
SpecificTransform.filterRefClasses(allAppClass, listOf("test.override.SuperSuper"))

Assert.assertFalse(
"直接调用父类方法时并不需要引用父类",
filterRefClasses.contains(targetClass)
)
}
}

0 comments on commit b33a8a7

Please sign in to comment.