发布版本的NoSuchMethodException

时间:2018-03-06 10:58:00

标签: android

我有这段代码

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规则,但没有做任何事情。

2 个答案:

答案 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来修复它!