gpt4 book ai didi

Java 自省(introspection) - 奇怪的行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:59:07 26 4
gpt4 key购买 nike

下面的代码是一个可以轻松重现问题的小示例。所以我有 String 类型的变量,在其上设置了默认值。我有 3 种方法:

  • setter/getter
  • 二传手
  • 将字符串转换为 boolean 值的便捷方法

内省(introspection)不会将 getter 作为 readMethod 返回,将 setter 作为 writeMethod 返回。相反,它返回 isTest() 方法作为 readMethod。 setter 是空的。

从文档中我了解到,如果类型是 boolean 值,则“is”方法比 get 具有更高的优先级,但类型是 String,因此即使查找“is-xxx”也没有意义方法?

public class Test {
public class Arguments {
private String test = Boolean.toString(true);

public boolean isTest() {
return Boolean.parseBoolean(test);
}

public String getTest() {
return test;
}

public void setTest(String test) {
this.test = test;
}
}

/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IntrospectionException {
BeanInfo info = Introspector.getBeanInfo(Arguments.class);
System.out.println("Getter: " + info.getPropertyDescriptors()[1].getReadMethod());
System.out.println("Setter: " + info.getPropertyDescriptors()[1].getWriteMethod());
PropertyDescriptor descr = new PropertyDescriptor("test", Arguments.class);
System.out.println("T");
}

}

有没有人对此有一些见解?

附加信息:

  1. 顺序不会改变结果。 isTest() 方法始终被视为 readMethod
  2. 如果我只是将 isTest() 重命名为 bsTest(),它会选择 getter 和 setter 作为 readMethod 和 writeMethod。所以它与“is-xxx”有关。

最佳答案

根据 JavaBeans specification,您得到的结果实际上是预期的结果.

引用第 8.3.1 段的简单属性:

If we discover a matching pair of get<PropertyName> and set<PropertyName> methods that take and return the same type, then we regard these methods as defining a read-write property whose name will be <propertyName>.

然后,引用 8.3.2 段的 boolean 属性:

This is<PropertyName> method may be provided instead of a get<PropertyName> method, or it may be provided in addition to a get<PropertyName> method.

In either case, if the is<PropertyName> method is present for a boolean property then we will use the is<PropertyName> method to read the property value.

在您的示例中,Introspector 正在检测 isTestgetTest方法。自 isTest优先于 getTest , 它使用 isTest确定 test 的类型属性为 boolean .但是,Introspector 期望 setter 具有签名 void setTest(boolean test)它没有找到它,所以 setter 方法是 null .

需要注意的重要一点是内省(introspection)器不会读取字段。它使用 getter/setter 方法的签名来确定存在哪些字段及其对应的类型。 isTest方法签名指定一个名为 test 的属性类型 boolean , 因此,无论 test 的实际类型如何, Introspector 会认为你的类有一个属性 boolean test .

其实对于所有Introspecter而言,属性test甚至可能不存在!您可以使用以下代码说服自己:

class Test {

public class Arguments {
public boolean isTest() {
return true;
}
}

public static void main(String[] args) throws IntrospectionException {
BeanInfo info = Introspector.getBeanInfo(Arguments.class);
System.out.println("Getter: " + info.getPropertyDescriptors()[1].getReadMethod());
System.out.println("Name of property: " + info.getPropertyDescriptors()[1].getName());
}

}

关于Java 自省(introspection) - 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32465502/

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