Java 实体类的属性 变量名 前两个字母大小写问题

"本文详细介绍了Java属性命名的规范,包括一般情况下小写字母开头的规则以及特殊情况如USA、XML等首字母大写的例外。同时,通过一个例子展示了在Web应用中,由于Introspector根据getter/setter方法查找属性时遵循的规则,可能导致找不到某些属性的问题。文章深入剖析了Introspector的工作原理,解释了为何${item.cId}
摘要由CSDN通过智能技术生成

Java属性命名规范:

        一个拥有Property(域/类变量)及其setter/getter的普通Java类,

         一般情况下,Java的属性变量名都以小写字母开头,如:userName,showMessage等。

         特殊情况下,一些特定的英文缩略词如(USA,XML等),JavaBean也允许大写字母起头的属性变量名,不过必须满足“变量的前两个字母要么全部大写,要么全部小写”

        如:

  • 合法:IDCode、ICCard、idCode等
  • 非法:iC、iCcard、iDCode等(在web应用中会报无法找到这个Property,因为根据"规则",需要找的是"Ic、IcCard、IdCode")

举个例子:

    public class RegionDTO  implements Serializable{  
        public String cId;  
        public String getCid() {  
            return cid;  
        }  
        public void setCid(String cid) {  
            this.cid = cid;  
        }  
        public String cName;      
          
        public String getCName() {  
            return cName;  
        }  
        public void setCName(String name) {  
            cName = name;  
        }  
      
    }  

封装成List后,然后在页面上用C标签进行显示

${item.cId}//报错 RegionDTO没有这个属性!!!  

原因:

(1)普通JavaBean处理涉及到相关类

在web应用中,Servlet容器或者EJB容器一般会使用java.beans包中的类来加载这些JavaBean。

BeanInfo(接口) ——> SimpleInfo(类)——> GenericBeanInfo(JavaBean数据装载类) ——> Introspector(JavaBean处理中最重要的一个处理类)

另外的一些辅助类,就不一一列举了。

(2)解密开始

在应用中,我们通常会用以下代码来获取一个普通JavaBean相关的信息:

BeanInfo mBeanInfo = null;
try {
    mBeanInfo = Introspector.getBeanInfo(Person.class);
} catch (IntrospectionException e) {
    e.printStackTrace();
}

(3)解密深入

在Introspector类的getBeanInfo方法中,我们发现其中与Property处理相关的行:

private GenericBeanInfo getBeanInfo() throws IntrospectionException {
    ……
    PropertyDescriptor apropertydescriptor[] = getTargetPropertyInfo();
    ……
}

(4)继续深入

在Property处理方法中,我们发现其处理方式是根据getter/setter的方法来得到Property(域/类变量)

private PropertyDescriptor[] getTargetPropertyInfo() throws IntrospectionException{
    ……
    if(s.startsWith("get")) obj = new PropertyDescriptor(decapitalize(s.substring(3)), method, null);
    ……
}

(5)关键

接下来,最关键的就是下面这个方法:

public static String decapitalize(String s) {
    if(s == null || s.length() == 0)
        //空处理
        return s;
    if(s.length() > 1 && Character.isUpperCase(s.charAt(1)) && Character.isUpperCase(s.charAt(0))){
        //长度大于1,并且前两个字符大写时,返回原字符串
        return s;
    } else{
        //其他情况下,把原字符串的首个字符小写处理后返回
        char ac[] = s.toCharArray();
        ac[0] = Character.toLowerCase(ac[0]);
        return new String(ac);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值