JavaBeans Introspector 无法正确查找具有接口层次结构类型的属性
我阅读了 JavaBeans 规范,但没有发现这种行为。这是一个错误吗?
testPropertyType
失败,因为需要Data
类testPropertyReadable
成功,因为DefaultBean.getMyData 返回数据
方法存在testPropertyWritable
失败,因为没有DefaultBean.setMyData(Data)
方法不存在
在 JavaSE 6 上测试
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import org.junit.Test;
public class DefaultBeanTest {
@Test
public void testPropertyType()
throws Exception
{
final BeanInfo beanInfo = Introspector.getBeanInfo(DefaultBean.class);
for (final PropertyDescriptor property : beanInfo.getPropertyDescriptors()) {
if ("class".equals(property.getName())) {
continue;
}
if ("myData".equals(property.getName())) {
if (!property.getPropertyType().equals(ModifiableData.class)) {
throw new AssertionError("expects " + ModifiableData.class + " but was "
+ property.getPropertyType());
}
}
}
}
@Test
public void testPropertyReadable()
throws Exception
{
final BeanInfo beanInfo = Introspector.getBeanInfo(DefaultBean.class);
for (final PropertyDescriptor property : beanInfo.getPropertyDescriptors()) {
if ("class".equals(property.getName())) {
continue;
}
if ("myData".equals(property.getName())) {
if (property.getReadMethod() == null) {
throw new AssertionError("expects read method");
}
}
}
}
@Test
public void testPropertyWritable()
throws Exception
{
final BeanInfo beanInfo = Introspector.getBeanInfo(DefaultBean.class);
for (final PropertyDescriptor property : beanInfo.getPropertyDescriptors()) {
if ("class".equals(property.getName())) {
continue;
}
if ("myData".equals(property.getName())) {
if (property.getWriteMethod() == null) {
throw new AssertionError("expects write method");
}
}
}
}
static interface Data {
}
static interface ModifiableData
extends Data {
}
static class DefaultData
implements ModifiableData {
}
static interface Bean {
Data getMyData();
}
static interface ModifiableBean
extends Bean {
ModifiableData getMyData();
void setMyData(
ModifiableData data);
}
static class DefaultBean
implements ModifiableBean {
@Override
public ModifiableData getMyData()
{
return this.data;
}
@Override
public void setMyData(
final ModifiableData data)
{
this.data = data;
}
private ModifiableData data;
}
}
I read the JavaBeans specs but I found nowhere this behavior. Is it a bug ?
testPropertyType
fails because expectsData
classtestPropertyReadable
succeed becauseDefaultBean.getMyData returning Data
method existstestPropertyWritable
fails because noDefaultBean.setMyData(Data)
method does not exists
Tested on JavaSE 6
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import org.junit.Test;
public class DefaultBeanTest {
@Test
public void testPropertyType()
throws Exception
{
final BeanInfo beanInfo = Introspector.getBeanInfo(DefaultBean.class);
for (final PropertyDescriptor property : beanInfo.getPropertyDescriptors()) {
if ("class".equals(property.getName())) {
continue;
}
if ("myData".equals(property.getName())) {
if (!property.getPropertyType().equals(ModifiableData.class)) {
throw new AssertionError("expects " + ModifiableData.class + " but was "
+ property.getPropertyType());
}
}
}
}
@Test
public void testPropertyReadable()
throws Exception
{
final BeanInfo beanInfo = Introspector.getBeanInfo(DefaultBean.class);
for (final PropertyDescriptor property : beanInfo.getPropertyDescriptors()) {
if ("class".equals(property.getName())) {
continue;
}
if ("myData".equals(property.getName())) {
if (property.getReadMethod() == null) {
throw new AssertionError("expects read method");
}
}
}
}
@Test
public void testPropertyWritable()
throws Exception
{
final BeanInfo beanInfo = Introspector.getBeanInfo(DefaultBean.class);
for (final PropertyDescriptor property : beanInfo.getPropertyDescriptors()) {
if ("class".equals(property.getName())) {
continue;
}
if ("myData".equals(property.getName())) {
if (property.getWriteMethod() == null) {
throw new AssertionError("expects write method");
}
}
}
}
static interface Data {
}
static interface ModifiableData
extends Data {
}
static class DefaultData
implements ModifiableData {
}
static interface Bean {
Data getMyData();
}
static interface ModifiableBean
extends Bean {
ModifiableData getMyData();
void setMyData(
ModifiableData data);
}
static class DefaultBean
implements ModifiableBean {
@Override
public ModifiableData getMyData()
{
return this.data;
}
@Override
public void setMyData(
final ModifiableData data)
{
this.data = data;
}
private ModifiableData data;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
https://bugs.java.com/bugdatabase/view_bug?bug_id=6852569
Java 7 的好消息
https://bugs.java.com/bugdatabase/view_bug?bug_id=6852569
The good news are for Java 7