6

私が持っている Bean クラスの PropertyDescriptor を作成しようとしています。呼んでいます

new PropertyDescriptor(myProperty, myClass)

メソッド「isMyProperty」が存在しないという例外が発生しています。コードを少し覗いてみましょう --

/**
 * Constructs a PropertyDescriptor for a property that follows
 * the standard Java convention by having getFoo and setFoo
 * accessor methods.  Thus if the argument name is "fred", it will
 * assume that the writer method is "setFred" and the reader method
 * is "getFred" (or "isFred" for a boolean property).  Note that the
 * property name should start with a lower case character, which will
 * be capitalized in the method names.
 *
 * @param propertyName The programmatic name of the property.
 * @param beanClass The Class object for the target bean.  For
 *      example sun.beans.OurButton.class.
 * @exception IntrospectionException if an exception occurs during
 *              introspection.
 */
public PropertyDescriptor(String propertyName, Class<?> beanClass)
    throws IntrospectionException {
this(propertyName, beanClass, 
     "is" + capitalize(propertyName), 
     "set" + capitalize(propertyName));
}

ドキュメントには、「getFred」を探すと書かれていますが、常に"is" + capitalize(property)! これはJavaバージョン「1.6.0_31」にあります

考え?

4

5 に答える 5

7

編集:あなたの問題が何であるかはわかっていると思います。プロパティがクラスに存在しない場合、「isProperty」メソッド エラーが発生します。私の例を見てください:

    {
        PropertyDescriptor desc = new PropertyDescriptor("uuid", Company.class);
        Method m = desc.getReadMethod();
        System.out.println(m.getName()); /* prints getUuid */
    }
    {
        PropertyDescriptor desc = new PropertyDescriptor("uuid11", Company.class);
        Method m = desc.getReadMethod();
        System.out.println(m.getName()); /* throws Method not found: isUuid11 */
    }

オリジナル:

読み取りメソッドとして isProperty にデフォルト設定されているように見え、存在しない場合は getProperty を使用します。getReadMethodメソッドを見てみましょう。

if (readMethod == null) {
    readMethodName = "get" + getBaseName();

そのため、最初に isProperty メソッドを試し、そのメソッドがない場合は getProperty を探します。

完全な方法は次のとおりです。

public synchronized Method getReadMethod() {
Method readMethod = getReadMethod0();
if (readMethod == null) {
    Class cls = getClass0();
    if (cls == null || (readMethodName == null && readMethodRef == null)) {
        // The read method was explicitly set to null.
        return null;
    }
    if (readMethodName == null) {
        Class type = getPropertyType0();
        if (type == boolean.class || type == null) {
            readMethodName = "is" + getBaseName();
        } else {
            readMethodName = "get" + getBaseName();
        }
    }

    // Since there can be multiple write methods but only one getter
    // method, find the getter method first so that you know what the
    // property type is.  For booleans, there can be "is" and "get"
    // methods.  If an "is" method exists, this is the official
    // reader method so look for this one first.
    readMethod = Introspector.findMethod(cls, readMethodName, 0);
    if (readMethod == null) {
        readMethodName = "get" + getBaseName();
        readMethod = Introspector.findMethod(cls, readMethodName, 0);
    }
    try {
        setReadMethod(readMethod);
    } catch (IntrospectionException ex) {
    // fall
    }
}
return readMethod;
}
于 2012-04-24T19:25:13.960 に答える
2

プロパティがプリミティブブール値の場合、PropertyDescriptor は「isProperty」メソッドを探します。プロパティがボックス化されたブール値の場合、PropertyDescriptor は「getProperty」メソッドを探します。

于 2013-07-18T15:51:10.617 に答える