【问题标题】:Can I use Reflection with ProGuard obfuscated classes?我可以将反射与 ProGuard 混淆类一起使用吗?
【发布时间】:2017-12-19 17:31:35
【问题描述】:

我有一个特定的类方法,我想使用Reflection invoke
这是我在Activity onCreate 中的代码示例:

try {
    aMethod = getClass().getDeclaredMethod("myMethodName", SomeParameter.class);
} catch (NoSuchMethodException e) {
    e.printStackTrace();
}

当我直接从 Android Studio 运行它时,它可以工作,但是当我创建发布版本时,ProGuard 不会自动更改方法名称。我能做什么?

【问题讨论】:

    标签: java android reflection proguard


    【解决方案1】:

    ProGuard documentation 提到以下内容:

    通常不可能计算出哪些类必须是 保留(使用它们的原始名称),因为类名可能是 例如,从配置文件中读取。因此,您必须 在你的 ProGuard 配置中指定它们,同样简单 - 保留选项。

    但是,在 某些 情况下,ProGuard 会自动处理反射。它们如下:(请参阅文档以获取最新列表)

    • Class.forName("SomeClass") SomeClass.class
    • SomeClass.class.getField("someField")
    • SomeClass.class.getDeclaredField("someField")
    • SomeClass.class.getMethod("someMethod", new Class[] {})
    • SomeClass.class.getMethod("someMethod", new Class[] { A.class })
    • SomeClass.class.getMethod("someMethod", new Class[] { A.class, B.class })
    • SomeClass.class.getDeclaredMethod("someMethod", new Class[] {})
    • SomeClass.class.getDeclaredMethod("someMethod", new Class[] { A.class })
    • SomeClass.class.getDeclaredMethod("someMethod", new Class[] { A.class, B.class })
    • AtomicIntegerFieldUpdater.newUpdater(SomeClass.class, "someField")
    • AtomicLongFieldUpdater.newUpdater(SomeClass.class, "someField")
    • AtomicReferenceFieldUpdater.newUpdater(SomeClass.class, SomeType.class, "someField")

    因此,就我而言,我的错误是我正在使用 getClass() 获取课程。
    以下行的效果很好。

    aMethod = MainActivity.class.getDeclaredMethod("myMethodName", SomeParameter.class);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-08
      • 2011-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      • 1970-01-01
      • 2012-10-10
      相关资源
      最近更新 更多