Java基本数据类型的Class问题


问题发现:项目需求,在调用第三方接口时,规定请求报文体为XML,所以需要将实体Bean或POJO转成XML的形式,我使用了XStream来完成序列化转换,其中因为驼峰命名的字段名跟接口报文规定的字段有所出入或者说完全不同,如代码中字段名为posId,但接口中定为pos_id,所以调用XStram的api,alias方法或者@XStreamAlias注解,拿alias方法来说,有两个参数,别名(String)和所要别名字段的Class类对象,所以我要将整个Bean别名,传该Bean的Class即可,如:
xStreamForReqData.alias("business_trans", xmlData.getClass());
要将String的字段别名,传(String字段).class即可。但对于int或者其他基本类型的字段来说,本以为应该转不了的,因为认为基本类型没有Class,但事实发现是可以的,如下为对基本类型字段起别名

    @XStreamAlias("pos_id")
    private int posId;

转化后的报文,结果说明可行。


  barcode_pay_request
  000000
  0
  0000
  00000
  00000
  
    00000000000
    1
    {"goods_detail":[{"goods_name":"红烧肉","quantity":"1","price":1,"goods_id":"2018112910076000000050624008"}]}
  

难道说基本类型也有Class对象?


证明:
查看JDK API的Class,发现文档中有说明,


“原始Java类型( boolean , byte , char , short , int , long , float和double ),和关键字void也表示为类对象。 ”
我们知道对于对象来说,可以直接使用对象.getClass()、Class.forName(className)或者类名.class都可以获取Class实例。
但是我们的基本数据类型,就没有类的权限定名,也没有getClass方法。
那么如何使用Class类来表示基本数据类型的Class实例?然后以Int为例,我查看了Integer的文档说明,发现有一个TYPE字段的说明

Java基本数据类型的Class问题_第1张图片

并查看Integer源码

    /**
     * The {@code Class} instance representing the primitive type  
     * {@code int}.
     *
     * @since   JDK1.1
     */
    @SuppressWarnings("unchecked")
    public static final Class  TYPE = (Class) Class
.getPrimitiveClass("int");          

然后实践,我们int.classs是可以获取到它的Class实例的,然后经过测试,发现int的Class实例、Integer.TYPE和Integer.class三者之间的关系如下:

    @Test
    public void test() {
        System.out.println("int.class == Integer.TYPE : " + (int.class == Integer.TYPE));
        System.out.println("int.class == Integer.class : " + (int.class == Integer.class));
    }


总结说明:
byte,short,int,long,char,float,double,boolean,void关键字
上述8种类型和void关键字,都有class属性.
表示int的Class对象: Class clz = int.class;
表示boolean的Class对象:  Class clz = boolean.class;
表示void的Class对象:Class clz = void.class;
在基本数据类型的包装器中都有这样一个常量:TYPE,表示的是该包装器对应的基本数据类型的Class实例。
但同时需注意基本数据类型和其包装器类型是不同的。

你可能感兴趣的:(Java)