Я прочитал спецификации JavaBeans, но я не нашел такого поведения. Это ошибка?
testPropertyType
терпит неудачу, потому что ожидает Data
class
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;
}
}