diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/ModVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/ModVisitor.java index 64ee4d9e4..a8b57758c 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/ModVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/ModVisitor.java @@ -200,15 +200,27 @@ public class ModVisitor extends AbstractVisitor { continue; } for (Map.Entry entry : annotation.getValues().entrySet()) { - Object value = entry.getValue(); - FieldNode constField = parentCls.getConstField(value); - if (constField != null) { - entry.setValue(constField.getFieldInfo()); - } + entry.setValue(replaceConstValue(parentCls, entry.getValue())); } } } + @SuppressWarnings({ "unchecked", "rawtypes" }) + private Object replaceConstValue(ClassNode parentCls, @Nullable Object value) { + if (value instanceof List) { + List listVal = (List) value; + if (!listVal.isEmpty()) { + listVal.replaceAll(v -> replaceConstValue(parentCls, v)); + } + return listVal; + } + FieldNode constField = parentCls.getConstField(value); + if (constField != null) { + return constField.getFieldInfo(); + } + return value; + } + private static void replaceConst(MethodNode mth, ClassNode parentClass, BlockNode block, int i, InsnNode insn) { FieldNode f; if (insn.getType() == InsnType.CONST_STR) { diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestReplaceConstsInAnnotations2.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestReplaceConstsInAnnotations2.java new file mode 100644 index 000000000..f4a9c958c --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestReplaceConstsInAnnotations2.java @@ -0,0 +1,44 @@ +package jadx.tests.integration.inner; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.junit.jupiter.api.Test; + +import jadx.tests.api.IntegrationTest; + +import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; + +public class TestReplaceConstsInAnnotations2 extends IntegrationTest { + + public static class TestCls { + @Target(ElementType.TYPE) + @Retention(RetentionPolicy.RUNTIME) + public @interface A { + int[] value(); + } + + @A(C.INT_CONST) + public static class C { + public static final int INT_CONST = 23412342; + } + + @A({ C.INT_CONST, C2.INT_CONST }) + public static class C2 { + public static final int INT_CONST = 34563456; + } + } + + @Test + public void test() { + assertThat(getClassNode(TestCls.class)) + .code() + // .containsOne("@A(C.INT_CONST)") // TODO: remove brackets for single element + .containsOne("@A({C.INT_CONST}") + .containsOne("@A({C.INT_CONST, C2.INT_CONST})") + .containsOne("23412342") + .containsOne("34563456"); + } +}