Fight the Future

Java言語とJVM、そしてJavaエコシステム全般にまつわること

EL${aName}でgetAName()が呼び出せないのはJava Beansの仕様?

タイトルのとおり、ELで${aName}と書いても、BeanのgetAName()は呼び出せない。
これ知ってるんだけど、なんで?けっこう長いこと疑問。何の仕様なんだろ。
Java Beansの仕様でこうなってるのかなあ。


(追記)
ひがさんとkoichikさんに教えていただきました!JavaBeansの仕様でした!

we normally convert the first character to lower case. However to support the occasional use of all upper-case names, we check if the first two characters of the name are both upper case and if so leave it alone.

Java SE Desktop Technologies - Java Beans


他にもたとえば、Seasar2のBeanDescImplクラスで、getterから「get」を取り除いた文字列を引数にして、プロパティ名に変換するメソッドがある。
要は、「FirstName」->「firstName」にするメソッド。

    private static String decapitalizePropertyName(String name) {
        if (StringUtil.isEmpty(name)) {
            return name;
        }
        if (name.length() > 1 && Character.isUpperCase(name.charAt(1))
                && Character.isUpperCase(name.charAt(0))) {

            return name;
        }
        char chars[] = name.toCharArray();
        chars[0] = Character.toLowerCase(chars[0]);
        return new String(chars);
    }

0番目の文字と1番目の文字が大文字だったら、変換せず引数をそのまま戻してる。
つまり、「AName」だったらaNameにはせず、「AName」のまま戻すってこと。

やっぱりどこかの仕様であるから、きちんとこうしてくれてる。
検索してもうまく見つからない。どこに書いてあるんだろう。。。