- 先创建一个实体类,用来测试:
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获取类中的属性,值等;