java - 如果代码将被混淆,我是否可以始终使用反射 API?

标签 java reflection obfuscation proguard

我发现似乎有 2 个通用解决方案:

  1. 不要混淆通过反射 API 引用的内容 [ Retroguard , Jobfuscate ]
  2. 用混淆后的名称替换反射 API 调用中的字符串。

这些解决方案仅适用于同一项目内的调用 - 客户端代码(在另一个项目中)可能不会使用反射 API 来访问非公共(public) API 方法。

在 2 的情况下,它也仅在反射 API 与编译时已知的字符串一起使用时起作用(私有(private)方法测试?)。在那些情况下 dp4j还提供了混淆后注入(inject)反射码的方案。

阅读 Proguard FAQ我想知道 2 在它说的时候是否总是有效:

ProGuard automatically handles constructs like Class.forName("SomeClass") and SomeClass.class. The referenced classes are preserved in the shrinking phase, and the string arguments are properly replaced in the obfuscation phase.

With variable string arguments, it's generally not possible to determine their possible values.

问:粗体字是什么意思?有例子吗?

最佳答案

With variable string arguments, it's generally not possible to determine their possible values.

public Class loadIt(String clsName) throws ClassNotFoundException {
    return Class.forName(clsName);
}

基本上,如果您向 Class.forName 传递一个非常量字符串,proguard 或任何混淆工具通常无法弄清楚您在谈论什么类,因此无法自动为您调整代码。

关于java - 如果代码将被混淆,我是否可以始终使用反射 API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5692191/

相关文章:

c - 这段经过混淆的 C 代码声称可以在没有 main() 的情况下运行,但它到底做了什么?

使用 yGuard 与服务提供商接口(interface)混合进行 Java 混淆

javascript - Websocket.onmessage 没有触发

java - 不区分大小写的 String.contains 方法的替代方法是什么?

java - 线程 "main"java.io.FileNotFoundException : 中出现异常

C# PropertyInfo(通用)

java - 如何将ArrayList发送到BaseAdapter Android

c# - Type.GetMethod with a Generic overload - Get Generic MethodInfo without looping through all Methods

java - 在 GWT 中探索数组而不知道其类型

Spring Boot 混淆器