为什么不加-keepattributes Signature,混淆后也能正确获取到泛型的类型,如下面的注释部分?

来源:3-5 Java 泛型的实现机制是怎样的?

慕尼黑5552265

2020-11-22

public abstract class GenericClass<T> {
    Class<T> type;

    public GenericClass() {
        this.type = (Class<T>) getClass();
    }

    public List<Map<T, T>> getValue() {
        return null;
    }
}
private void getGenericsArguments() {
        // 匿名内部类
        GenericClass<String> genericClass = new GenericClass<String>() {
            @Override
            public List<Map<String, String>> getValue() {
                return null;
            }
        };

        ParameterizedType superType = (ParameterizedType) genericClass.getClass().getGenericSuperclass();
        for (Type actualTypeArgument : superType.getActualTypeArguments()) {
            System.out.println(TAG + " Superclass + actualTypeArgument: " + actualTypeArgument);
            // GenericTest Superclass + actualTypeArgument: class java.lang.String
        }

        try {
            ParameterizedType methodType = (ParameterizedType) genericClass.getClass().getMethod("getValue").getGenericReturnType();
            for (Type actualTypeArgument : methodType.getActualTypeArguments()) {
                System.out.println(TAG + " Method + actualTypeArgument: " + actualTypeArgument);
                // GenericTest Method + actualTypeArgument: java.util.Map<java.lang.String, java.lang.String>
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
写回答

1回答

bennyhuo

2020-11-23

那应该是其他的混淆选项包含了keep attributes。

你可以找个class阅读器打开混淆后的class文件,看下,应该是泛型信息没有被混淆掉。

0
1
慕尼黑5552265
非常感谢!
2020-11-23
共1条回复

大厂资深面试官 带你破解Android高级面试

改变视野和思维 深度与广度兼备的 Android 进阶面试指导课程

1636 学习 · 222 问题

查看课程