gpt4 book ai didi

java - 预期对 'String' 原始类型进行拆箱,但返回 null

转载 作者:太空宇宙 更新时间:2023-11-04 10:13:06 24 4
gpt4 key购买 nike

我正在尝试使用 Java Reflection 来调用一个将回调作为参数的方法。我使用 Java Reflection 实例化所有对象。另外,我正在使用 Java Dynamic Proxy Class作为回调参数。

我有一些奇怪的行为:

  1. java.lang.reflect.Proxy.newProxyInstance() 方法返回 null

  2. 以下类型的错误,具体取决于我尝试的以下代码的不同版本:

    1. 预期拆箱“int”基元类型,但返回 null

    2. 预期拆箱“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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com