我阅读了 JavaBeans 规范,但没有发现这种行为。这是一个错误吗?
testPropertyType
失败,因为期望Data
类testPropertyReadable
成功,因为DefaultBean.getMyData returning Data
方法存在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;
}
}