我有这段代码
String className = "namehere";
Class<?> someClass = Class.forname(className);
Object object = someClass.newInstance();
String methodname = "mymethod";
Method setSomething = object.getClass().getMethod(methodname);
String []ab = (String[]) setSomething.invoke(object);
在我的发布版中,这给了我一个错误。
这是我的错误
W/System.err: java.lang.NoSuchMethodException: kryWerk [class java.lang.String, int]
W/System.err: at java.lang.Class.getMethod(Class.java:1981)
W/System.err: at java.lang.Class.getMethod(Class.java:1637)
W/System.err: at mypack.getWerkBl(werkData.java:171)
W/System.err: at mypack.Werk.werk(Werk.java:618)
W/System.err: at mypack.Werk$16.onItemClick(Werk.java:727)
W/System.err: at android.widget.AdapterView.performItemClick(AdapterView.java:310)
W/System.err: at android.widget.AbsListView.performItemClick(AbsListView.java:1156)
W/System.err: at android.widget.AbsListView$PerformClick.run(AbsListView.java:3121)
W/System.err: at android.widget.AbsListView$3.run(AbsListView.java:4036)
W/System.err: at android.os.Handler.handleCallback(Handler.java:751)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
W/System.err: at android.os.Looper.loop(Looper.java:154)
W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6119)
W/System.err: at java.lang.reflect.Method.invoke(Native Method)
W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
我首先尝试改变progaurd规则,但没有做任何事情。
答案 0 :(得分:0)
如果您在发布版本中遇到此问题,可能是因为代码的obfuscation
。如果对您的代码进行模糊处理并不重要,则可以false
使用minifyEnabled
,如下所示
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
因为packagename和class name没有改变,或者使用-keep public class my.package.MyClass
来阻止Class.forName
在运行时加载的这个类被混淆。
<强>更新强>
根据您的错误消息,您需要更改-keep
,如下所示:
-keep public class my.package.MyClass {
public void myMethod(android.content.Context, boolean);
public java.lang.String myMethod1();
//any other method that you want to call by Class.forName should be listed here
}
答案 1 :(得分:0)
问题不在于progaurd似乎...... 我通过将所有方法设置为Public来修复它!