java - 反射找不到构造函数
问题描述
我有那堂课:
public class DNDRunner {
private NotificationManager mNoMan;
public DNDRunner(Context context) {
mNoMan = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
}
public void run(String param) {
mNoMan.setZenMode(Integer.parseInt(param), null, "DNDRunner");
}
}
我通过反射调用运行方法:
try {
Class mRunner = Class.forName(runner);
Constructor constructor = mRunner.getConstructor(new Class[]{Context.class});
Object object = constructor.newInstance(new Object[]{mContext});
Method run = mRunner.getMethod("run", new Class[]{String.class});
run.invoke(object, new Object[]{value});
} catch (Exception e) {
Log.e(TAG, "Runner", e);
}
但我得到:
java.lang.NoSuchMethodException: <init> [class android.content.Context]
at java.lang.Class.getConstructor0(Class.java:2320)
at java.lang.Class.getConstructor(Class.java:1725)
我做错了什么?构造函数显然在那里
更新:
测试:
private void executeRunner() {
try {
Class mRunner = Class.forName(runner);
Constructor<?> constructor = mRunner.getDeclaredConstructor(Context.class);
Log.d(TAG, "Is public constructor? " + Modifier.isPublic(constructor.getModifiers()));
Object object = constructor.newInstance(mContext);
Method run = mRunner.getDeclaredMethod("run", String.class);
run.invoke(object, value);
} catch (Exception e) {
Log.e(TAG, "Runner", e);
}
}
但我得到同样的错误:
06-25 20:24:44.703 2420 2420 E OmniAction: Runner
06-25 20:24:44.703 2420 2420 E OmniAction: java.lang.NoSuchMethodException: <init> [class android.content.Context]
06-25 20:24:44.703 2420 2420 E OmniAction: at java.lang.Class.getConstructor0(Class.java:2320)
06-25 20:24:44.703 2420 2420 E OmniAction: at java.lang.Class.getDeclaredConstructor(Class.java:2166)
06-25 20:24:44.703 2420 2420 E OmniAction: at org.omnirom.omnilib.actions.OmniAction.executeRunner(OmniAction.java:148)
06-25 20:24:44.703 2420 2420 E OmniAction: at org.omnirom.omnilib.actions.OmniAction.execute(OmniAction.java:89)
06-25 20:24:44.703 2420 2420 E OmniAction: at org.omnirom.omnibrain.EventService.execOmniActions(EventService.java:302)
06-25 20:24:44.703 2420 2420 E OmniAction: at org.omnirom.omnibrain.EventService.execOnConnectActions(EventService.java:257)
06-25 20:24:44.703 2420 2420 E OmniAction: at org.omnirom.omnibrain.EventService.-wrap5(Unknown Source:0)
06-25 20:24:44.703 2420 2420 E OmniAction: at org.omnirom.omnibrain.EventService$2.onReceive(EventService.java:189)
06-25 20:24:44.703 2420 2420 E OmniAction: at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$-android_app_LoadedApk$ReceiverDispatcher$Args_52497(LoadedApk.java:1313)
06-25 20:24:44.703 2420 2420 E OmniAction: at android.app.-$Lambda$aS31cHIhRx41653CMnd4gZqshIQ.$m$7(Unknown Source:4)
06-25 20:24:44.703 2420 2420 E OmniAction: at android.app.-$Lambda$aS31cHIhRx41653CMnd4gZqshIQ.run(Unknown Source:39)
06-25 20:24:44.703 2420 2420 E OmniAction: at android.os.Handler.handleCallback(Handler.java:790)
06-25 20:24:44.703 2420 2420 E OmniAction: at android.os.Handler.dispatchMessage(Handler.java:99)
06-25 20:24:44.703 2420 2420 E OmniAction: at android.os.Looper.loop(Looper.java:164)
06-25 20:24:44.703 2420 2420 E OmniAction: at android.app.ActivityThread.main(ActivityThread.java:6499)
06-25 20:24:44.703 2420 2420 E OmniAction: at java.lang.reflect.Method.invoke(Native Method)
06-25 20:24:44.703 2420 2420 E OmniAction: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
06-25 20:24:44.703 2420 2420 E OmniAction: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
06-25 20:24:44.705 1692 1697 I zygote64: Do full code cache collection, code=507KB, data=308KB
奇怪的 .... :(
我无法理解它如何找到类,但它无法读取构造函数。
在再次构建之前,我正在清理对先前代码的所有引用:
find out/ -name *OmniBrain* -exec rm -rf {} +
解决方案
试试这个:
Constructor<?> constructor = mRunner.getConstructor(Context.class);
Object object = constructor.newInstance(this)
推荐阅读
- r - R如何执行“特定”采样
- python - lmfit 对复杂方程/数据进行最小化(或 scipy.optimize leastsq)
- python - pyspark计算当前时间和上次活动时间之间差异的移动平均值
- amazon-web-services - 通过 AWS Cloudfront 在特定端口上设置到源服务器资源的连接
- python - 自编码器算法和原理以及为什么编码器部分模糊
- spring - 具有多个 @Configuration 类的 Spring Boot/Batch 不实例化 bean(或加载属性)
- c# - MailKit 的 SendAsync() SmtpCommandException
- javascript - Chrome 正在缓存 service-worker.js,即使使用 Cache-Control: no-store, no-cache Max-Age: 0
- php - 我可以安全地删除 cpanel/php/sessions/ea-php56 吗?OpenCart 2.3.0.2
- python - 视图 management.views.home 没有返回 HttpResponse 对象。它返回 None 而不是