- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 Java Reflection 来调用一个将回调作为参数的方法。我使用 Java Reflection 实例化所有对象。另外,我正在使用 Java Dynamic Proxy Class作为回调参数。
我有一些奇怪的行为:
java.lang.reflect.Proxy.newProxyInstance()
方法返回 null
以下类型的错误,具体取决于我尝试的以下代码的不同版本:
预期拆箱“int”基元类型,但返回 null
预期拆箱“String”基元类型,但返回 null
这是我想要实例化为匿名对象作为 Java 动态代理类的接口(interface):
public interface MyListener {
void onEvent(String eventName);
}
这是我如何通过 newProxyInstance()
实例化接口(interface):
Object callbackObject = null;
try {
Class callbackClass = Class.forName("com.example.MyListener");
Class[] interfaceArray = new Class[]{callbackClass};
InvocationHandler invocationHandler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals("onMyEvent")) {
Log.d(TAG, "InvocationHandler.invoke onMyEvent");
}
return null;
}
};
callbackObject = java.lang.reflect.Proxy.newProxyInstance(
this.getClass().getClassLoader(),
interfaceArray,
invocationHandler);
}
catch (Throwable t) {
Log.e(TAG, "newProxyInstance got exception [" + t + "] caused by [" + t.getCause() + "]");
}
Log.d(TAG, "callbackObject=[" + callbackObject + "]");
if (null == callbackObject) {
Log.e(TAG, "callbackObject is null according to null check");
}
else {
Log.d(TAG, "callbackObject is NOT null according to null check");
}
日志消息似乎在回调对象是否为 null 方面存在冲突:
callbackObject=[null]
callbackObject is NOT null according to null check
根据Why does newInstance() return null? newProxyInstance()
不可能返回 null,因为它从 newInstance()
获取值。
那么newProxyInstance()
的结果怎么会是null
而不是null
呢?这些错误消息(例如 Expected to unbox a 'int' Primitive type but was returned null
)意味着什么?
最佳答案
解决方案:java.lang.reflect.Proxy.newProxyInstance()
方法返回null
我发现 newProxyInstance()
返回的对象不是 null
,它只是看起来是null
。打印出返回值的日志消息显示它为 null,因为 Java 隐式调用了该对象的 toString()
。但由于该对象是一个Proxy
,它会被转发到我的InitationHandler
。真正的问题是我的 InvocationHandler
总是返回 null
。我认为 null
比较合适,因为 onEvent()
方法返回 void
。但是,我没有预料到 toString()
也会被转发到 InvocationHandler
。
解决方案:预期对“int”基元类型进行拆箱,但返回 null
在尝试调试明显的 null
时,我最终尝试在 newProxyInstance()
返回的对象上调用其他方法,例如 hashcode()
和 getClass()
。 所有这些方法都被转发到InvocableHandler
,而它并不期望它们,因此它只是返回null
。由于 null
不是有效的 int
,因此 hashcode()
函数会导致错误 Expected to unbox a 'int' Primitive type but returned null
。
我能够通过使我的 InitationHandler
更加健壮来消除此错误:
InvocationHandler invocationHandler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals("onMyEvent")) {
Log.d(TAG, "InvocationHandler.invoke onMyEvent");
return null;
}
else if (String.class == method.getReturnType()) {
return "";
}
else if (Integer.class == method.getReturnType()) {
return Integer.valueOf(0);
}
else if (int.class == method.getReturnType()) {
return 0;
}
else if (Boolean.class == method.getReturnType()) {
return Boolean.FALSE;
}
else if (boolean.class == method.getReturnType()) {
return false;
}
else {
return null;
}
}
};
但是,对我来说,实际的解决方案只是删除调用 hashcode()
等的调试代码,并相信 newProxyInstance()
结果不是 null
。将来,请记住 IncationHandler
会转发所有方法调用。
感谢artaxerxe's solution for Proxy object throws NullPointerException给了我洞察力。
关于java - 预期对 'String' 原始类型进行拆箱,但返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52083338/
我对java有点陌生,所以如果我犯了一个简单的错误,请原谅我,但我不确定我哪里出错了,我收到的错误是“预期的.class,预期的标识符,而不是声明, ';'预期的。”我尝试了不同的方法,并从这些方法中
This question already has answers here: chai test array equality doesn't work as expected (3个答案) 3年前
我正在学习 Java(对不起,我的英语很差,这不是我的母语),当我在 Eclipse (JavaSE-1.7) 中在我输入的每个“try”中执行“try-finally” block 时,会出现以下消
我收到两个错误,指出 token 上的语法错误,ConstructorHeaderName expected instead & token “(”上的语法错误,< expected 在线: mTM.
我找不到错误。 Eclipse 给我这个错误。每个 { } 都是匹配的。请帮忙。 Multiple markers at this line - Syntax error on token “)”,
代码: import java.awt.*; import javax.swing.*; import java.awt.event.*; public class DoubleIt extends
我正在用 python(Vs 代码)编写代码,但出现此错误: Expected ")" Pylance 错误发生在:def main() 我试着运行我的 main 并将它打印到我的屏幕上。我用谷歌搜
我正在尝试按照 documentation 中的建议使用异步函数。但我收到此错误 意外的 token ,预期 ( async function getMoviesFromApi() { try
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
第一行包含一个表示数组长度的整数p。第二行包含用空格分隔的整数,这些整数描述数组中的每个元素。第三行打印一个整数,指示负数组的数量。 package asgn3; import java.util.*
好的,我是初学者,我必须修复此 java 表达式语言代码才能在我的系统 (Windchill) 中工作,但看起来我在语法中遗漏了一些内容: LWCNormalizedObject lwc =
我无法编译我的程序! 我想我缺少一个花括号,但我怎么也看不出在哪里! import javax.swing.*; import java.awt.*;
我的 jQuery 代码有问题,我的 Firebug 向我发出警告:需要选择器。 这是代码: $("img[id$='_tick']").each(function() { $(this).c
我的新类(class) Fountainofyouth 遇到了问题。尝试构建整个项目后,调试器显示 warning: extended initializer lists only available
我已经从 Java 转向 CPP,并且正在努力围绕构造构造函数链进行思考,我认为这是我的问题的根源。 我的头文件如下: public: GuidedTour(); GuidedTour(string
鉴于以下 for(var i=0; i< data.cats.length; i++) list += buildCategories(data.cats[i]); jsLint 告诉我 Expect
我有这个 json,但 Visual Studio Code 在标题中给了我警告。 [ { "title": "Book A", "imageUrl": "https:
我正在尝试编写一个有条件地禁用四个特殊成员函数(复制构造、移动构造、复制赋值和移动赋值)的包装类,下面是我用于测试目的的快速草稿: enum class special_member : uint8_
所以我用 F# 编写了一个非常简单的程序,它应该对 1000 以下的所有 3 和 5 的倍数求和: [1..999] |> List.filter (fun x -> x % 3 = 0 || x %
我是一名优秀的程序员,十分优秀!