Java反射的用法
主要反射API,用来生成在当前JAVA虚拟机中的类、接口或者对象的信息。
1.Class类:反射的核心类,可以获取类的属性,方法等内容信息。
2.Field类:Java.lang.reflect.表示类的属性,可以获取和设置类的中属性值。
3.Method类:Java.lang.reflect,表示类的方法,它可以用来获取类中方法的信息或者执行方法
4.Construcor类:Java.lang.reflect,表示类的构造方法。
下面是示例代码:
实体类:
public class UserEntity {
private Integer userId;
private String userName;
private String userSex;
private Integer userAge;
public UserEntity() {}
public UserEntity(Integer userId, String userName, String userSex, Integer userAge) {
this.userId = userId;
this.userName = userName;
this.userSex = userSex;
this.userAge = userAge;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserSex() {
return userSex;
}
public void setUserSex(String userSex) {
this.userSex = userSex;
}
public Integer getUserAge() {
return userAge;
}
public void setUserAge(Integer userAge) {
this.userAge = userAge;
}
@Override
public String toString() {
return "UserEntity{" +
"userId=" + userId +
", userName='" + userName + '\'' +
", userSex='" + userSex + '\'' +
", userAge=" + userAge +
'}';
}
}
util类:
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map;
public class ReflectUtil<T> {
/**
* 方法用途: 给实体属性赋值<br/>
* 操作步骤: TODO<br/>
* ${tags}
*/
public static <T> Object getObject(Class<T> clazz, Map<String, Object> map) {
Object obj = null;
try {
// 构造方法;如果包含参数,并给属性赋值clazz.getConstructor(Integer.class,String.class,String.class,Integer.class)
Constructor constructor = clazz.getConstructor();
// 有参构造方法constructor.newInstance(110,"张三丰","man",99),等价new UserEntity(110,"张三丰","man",99)
obj = constructor.newInstance();
// 无构造函数,给属性赋值
Method method = null;
// getFields只能拿到public属性,想要拿到private属性就用getDeclaredFields
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
// 将field可见性设置为true,默认为false(如果没有设为true报错)
field.setAccessible(true);
// 属性类别:Integer、String、Boolean等
String fieldType = field.getType().getName();
// 属性名称
String fieldName = field.getName();
if (fieldType.equals("java.lang.Boolean")) {
method = clazz.getDeclaredMethod("is" + getMethodName(fieldName), field.getType());
} else {
method = clazz.getDeclaredMethod("set" + getMethodName(fieldName), field.getType());
}
/*if (fieldType.equals("java.lang.Integer")) {
method = clazz.getDeclaredMethod("set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1), Integer.class);
} else if (fieldType.equals("java.lang.String")) {
method = clazz.getDeclaredMethod("set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1), String.class);
}*/
for (String key : map.keySet()) {
if (fieldName.equals(key)) {
// 给属性赋值,等价于set方法(xxx.set())
method.invoke(obj, map.get(key));
break;
}
}
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return obj;
}
public static void getMethod(Class clazz) {
try {
Method method = clazz.getDeclaredMethod("getUserId");
System.out.println(method.getName());
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
/**
* 方法用途: 获取实体所有属性值<br/>
* 操作步骤: TODO<br/>
* ${tags}
*/
public static void getBeanValues(Object object) {
Class clazz = object.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
// 同样需要先将field可见性设为可见
field.setAccessible(true);
try {
// field.get() 获取属性值
System.out.println(field.get(object));;
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
/**
* 方法用途: 把一个字符串的第一个字母大写、效率是最高的<br/>
* 操作步骤: TODO<br/>
* ${tags}
*/
private static String getMethodName(String fildeName) {
byte[] items = fildeName.getBytes();
items[0] = (byte) ((char) items[0] - 'a' + 'A');
return new String(items);
}
public static void main(String[] args) {
Map<String, Object> map = new HashMap<>();
map.put("userId", 110);
map.put("userName", "张三丰");
map.put("userSex", "man");
map.put("userAge", 99);
UserEntity userEntity = (UserEntity) ReflectUtil.getObject(UserEntity.class, map);
ReflectUtil.getMethod(UserEntity.class);
ReflectUtil.getBeanValues(userEntity);
}