Java反射的基本应用

  • 先创建一个实体类,用来测试: 
import javax.persistence.Id;

import javax.persistence.Column;
import javax.persistence.Table;
import java.util.Date;
@Table(name = "co_user")
public class UserPo {
    @Id
    @Column(name = "guid")
    private String guid;
    @Column(name = "user_name")
    private String userName;
    @Column(name = "password")
    private String password;
    @Column(name = "icon")
    private String icon;
    @Column(name = "email")
    private String email;
    @Column(name = "nick_name")
    private String nickName;
    @Column(name = "note")
    private String note;
    @Column(name = "create_time")
    private Date createTime;
    @Column(name = "login_time")
    private Date loginTime;
    @Column(name = "status")
    private String status;
}
  • 利用反射获取实体中@Table注解的表名


    // 利用反射获取实体中@Table注解的表名
    @Test
    public void getTableName() {
        Map<String, Object> map = new ConcurrentHashMap<>();
        Class<UserPo> clazz = UserPo.class;
        String simpleName = clazz.getSimpleName();
        Table annotation = clazz.getAnnotation(Table.class);
        String name = annotation.name();
        map.put(simpleName, name);
        System.out.println("通过反射获取实体的表明" + map);
    }

  • 测试结果:


  •  获取实体属性名和属性值,为了测试方便,先给实体赋值;

import javax.persistence.Id;

import javax.persistence.Column;
import javax.persistence.Table;
import java.util.Date;

@Table(name = "co_user")
public class UserPo {
    @Id
    @Column(name = "guid")
    private String guid = "31cd112e-4efd-41bd-9d97-6d7cd39cbd0f";
    @Column(name = "user_name")
    private String userName = "张明";
    @Column(name = "password")
    private String password1 = "测试";
    @Column(name = "icon")
    private String icon = "测试";
    @Column(name = "email")
    private String email = "111@163.com";
    @Column(name = "nick_name")
    private String nickName = "张";
    @Column(name = "note")
    private String note = "备注";
    @Column(name = "create_time")
    private String createTime = "2022-10-06 15:53:51";
    @Column(name = "login_time")
    private String loginTime = "2022-10-09 15:53:51";
    @Column(name = "status")
    private Integer status = 1;
}

 测试代码:

// 利用反射获取实体的属性值
    @Test
    @SneakyThrows
    public void getEntityValue() {
        // 这里为了测试方便,先给实体属性赋值;
        Map<String, Object> map = new HashMap<>();
        Class<UserPo> clazz = UserPo.class;
        BeanInfo beanInfo = Introspector.getBeanInfo(clazz);
        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
        for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
            // 获取字段名
            String name = propertyDescriptor.getName();
            if (ObjectUtils.isNotEmpty(name)) {
                // 去掉class属性
                if ("class".equals(name)) {
                    continue;
                }
                // 获取getter方法
                Method readMethod = propertyDescriptor.getReadMethod();
                Object invoke = readMethod.invoke(clazz.newInstance());
                map.put(name, invoke);
            }
        }
        System.out.println("获取到的属性名和值为:" + map);
    }

测试结果: 


获取到的属性名和值为:{note=备注, password=123456, loginTime=2022-10-09 15:53:51, createTime=2022-10-06 15:53:51, nickName=张, icon=测试, guid=31cd112e-4efd-41bd-9d97-6d7cd39cbd0f, userName=张明, email=111@163.com, status=1}

  •  通过注解@Id获取主键以及主键值

所用同一个实体:

 // 通过注解@Id获取主键以及主键值
    @Test
    @SneakyThrows
    public void getPrimaryValue() {
        // 这里为了测试方便,先给实体属性赋值;
        Map<String, Object> map = new HashMap<>();
        Class<UserPo> clazz = UserPo.class;
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {

            Id annotation = field.getAnnotation(Id.class);
            if (annotation != null) {
                log.info("----" + field.getName());
                // 获取主键的getter方法
                String getName = "get" + field.getName().substring(0,1).toUpperCase() + field.getName().substring(1);
                Method declaredMethod = clazz.getDeclaredMethod(getName);
                Object invoke = declaredMethod.invoke(clazz.newInstance());
                map.put(field.getName(), invoke);
                System.out.println(map);
            }
        }

    }

测试结果:

{guid=31cd112e-4efd-41bd-9d97-6d7cd39cbd0f}

  • 通过注解@Column获取字段名和属性名

 // 通过注解@Column获取字段名和属性名
    @Test
    public void getColumnValue() {
        Map<String, Object> map = new HashMap<>();
        Class<UserPo> clazz = UserPo.class;
        Field[] declaredFields = clazz.getDeclaredFields();
        for (Field field : declaredFields) {
            // 判断@Column注解是否在此字段上
            if (field.isAnnotationPresent(Column.class)) {
                Column annotation = field.getDeclaredAnnotation(Column.class);
                String column = annotation.name();
                String fieldName = field.getName();
                map.put(fieldName, column);
            }
        }
        System.out.println(map);
    }

 测试结果:

{note=note, password=password, loginTime=login_time, createTime=create_time, nickName=nick_name, icon=icon, guid=guid, userName=user_name, email=email, status=status}

 以上,就是利用java反射的api获取类中的属性,值等;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值