MyBatis源码解读 - MetaClass-类信息获取反射工具类

MyBatis源码解读系列文章

简介

MetaClass 是 Mybatis 中的反射工具类,与 MetaObject 不同的是,MetaObject 用于获取和设置对象的属性值,而 MetaClass 则用于获取类相关的信息。

示例

Order.java:

@Data
@AllArgsConstructor
public class Order {
    /** 主键 */
    private String id;
    /** 订单号 */
    private String orderNo;
    /** 商品名称 */
    private String goodsName;
}

User.java:

@Data
@AllArgsConstructor
public class User {
    /** 主键 */
    private String id;
    /** 用户名 */
    private String username;
    /** 邮箱 */
    private String email;
    /** 订单 */
    List orders;
}

示例:

public static void main(String[] args) {
    MetaClass metaClass = MetaClass.forClass(Order.class, new DefaultReflectorFactory());
    // 获取所有有get方法的属性名
    String [] getterNames = metaClass.getGetterNames();
    System.out.println(new Gson().toJson(getterNames));
    // 是否有默认构造方法
    boolean hasDefaultConstructor = metaClass.hasDefaultConstructor();
    System.out.println("是否有默认的构造方法:" + hasDefaultConstructor);
    // 某个属性是否有get/set方法
    boolean hasGetter = metaClass.hasGetter("goodsName");
    System.out.println("goodsName属性是否有get方法:" + hasGetter);
    boolean hasSetter = metaClass.hasSetter("goodsName");
    System.out.println("goodsName属性是否有set方法:" + hasSetter);
    // 某个属性的类型
    Class getterType = metaClass.getGetterType("goodsName");
    System.out.println("goodsName属性类型:" + getterType.getName());
    // 通过Invoker对象调用get方法获取属性值
    try {
        Invoker invoker = metaClass.getGetInvoker("goodsName");
        Order testOrder = new Order("1", "001", "美的电压力锅");
        Object propertyValue = invoker.invoke(testOrder, null);
        System.out.println("goodsName属性值:" + propertyValue);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

输出结果:

["orderNo","id","goodsName"]
是否有默认的构造方法:false
goodsName属性是否有get方法:true
goodsName属性是否有set方法:true
goodsName属性类型:java.lang.String
goodsName属性值:美的电压力锅



发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章