gpt4 book ai didi

具有可选返回类型的 JavaBean 自省(introspection)

转载 作者:行者123 更新时间:2023-11-30 01:56:36 28 4
gpt4 key购买 nike

java.beans.Introspector#getBeanInfo

将 getter 返回类型更改为 com.google.common.base.Optional 时,编译不完整的 PropertyDescriptor

我使用的是 Java 7,因此必须使用 Guava 的Optional。我想在我的 JavaBean 中使用它作为返回类型。我准备了这两个小型单元测试来概述问题:

import static org.junit.Assert.*;    
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import org.junit.Test;
import com.google.common.base.Optional;

public class BeanOptionalTest {

class SimpleBean {
private String foo;
public String getFoo() { return foo; }
public void setFoo(String foo) { this.foo = foo; }
}

@Test
public void test_SimpleBean() throws Exception {
assertFooProperty(SimpleBean.class);
}

class OptionalBean {
private String foo;
public Optional<String> getFoo() { return Optional.fromNullable(foo); }
public void setFoo(String foo) { this.foo = foo; }
}

@Test
public void test_OptionalBean() throws Exception {
assertFooProperty(OptionalBean.class);
}

private void assertFooProperty(Class<?> beanClass) throws IntrospectionException {
BeanInfo beanInfo = Introspector.getBeanInfo(beanClass);
assertEquals(2, beanInfo.getPropertyDescriptors().length);
PropertyDescriptor fooDescriptor = beanInfo.getPropertyDescriptors()[1];
assertNotNull(fooDescriptor.getReadMethod());
assertEquals("getFoo", fooDescriptor.getReadMethod().getName());
assertNotNull(fooDescriptor.getWriteMethod());
assertEquals("setFoo", fooDescriptor.getWriteMethod().getName());
}
}

test_OptionalBean 失败,因为写入方法为 null。据推测,内省(introspection)器将 foo 与类型 Optional 匹配,而不是 String

尽管将返回类型更改为可选,但如何更改此行为才能接收完整的PropertyDescriptor

最佳答案

您的测试失败,因为 OptionalBean::setFoo 的参数类型与 OptionalBean::getFoo 的返回类型不匹配。一个PropertyDescriptor特定于类型,此处 Optional<String>String不是同一类型,即使在概念上它们紧密相关。

使用当前的 JavaBeans 实现,您无法做您想做的事情。您可以做的是编写自己的BeanInfo类似对象,为您进行内省(introspection)但不实现 BeanInfo .

关于具有可选返回类型的 JavaBean 自省(introspection),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54277319/

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