我想使用invoke
来Reflection
使用某种类方法
以下是我的Activity onCreate
中的代码示例:
try {
aMethod = getClass().getDeclaredMethod("myMethodName", SomeParameter.class);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
当我直接从Android Studio运行它时,它可以工作,但是当我创建发布版本时,ProGuard不会自动更改方法名称。我该怎么办?
答案 0 :(得分:3)
ProGuard documentation提及以下内容:
通常无法计算必须使用哪些类 保留(以其原始名称),因为类名可能是 例如,从配置文件中读取。你必须这样做 在ProGuard配置中指定它们,同样简单 - 保持选择。
但是,有一些 SOME 案例,ProGuard会自动处理Reflection。这些是以下内容:(请参阅最新列表的文档)
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);