Class-API
- getField
getField(String name)
: 能获取 public 的字段,包括父类的;getDeclaredField(String name)
: 只能获取自己声明的各种字段,包括public,protected,private。
- newInstance
- clazz.
newInstance() 废弃 - 使用
clazz.getDeclaredConstructor().newInstance()
代替
demo
reflect
package com.common.cn.reflect;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface XmlModelDesc {
String value() default "";
}
package com.common.cn.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;
public class ReflectUtil {
public static void main(String[] args) {
ReflectTest reflectTest = new ReflectTest();
reflectTest.setSex("女");
reflectTest.setName("good");
ReflectTest reflectTest2 = new ReflectTest();
reflectTest2.setSex("女");
reflectTest2.setName("good");
ReflectTestSon son = new ReflectTestSon();
son.setSex("女");
son.setName("good");
son.setAge("18");
ReflectTestSon son1 = new ReflectTestSon();
son1.setSex("女");
son1.setName("good");
son1.setAge("19");
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_YEAR, 1);
son1.setTimeOrder(cal.getTime());
ReflectTestSon son2 = new ReflectTestSon();
son2.setSex("女");
son2.setName("good");
son2.setAge("20");
son2.setTimeOrder(new Date());
List<ReflectTestSon> list = new ArrayList<>();
list.add(son);
list.add(son1);
list.add(son2);
System.out.println();
try {
System.out.println("fieldVal= " + getFieldVal("sex",reflectTest));
System.out.println("compare = " + compare(reflectTest, reflectTest2));
System.out.println("2Map = " + convert2Map(son ));
sort(list, "timeOrder");
list.forEach(reflectTestSon -> System.out.println(reflectTestSon.getTimeOrder() +" # " + reflectTestSon.getAge()));
System.out.println("annotation = " + getAnnotation(son2, "timeOrder"));
System.out.println("method_call = " + ReflectUtil.call("getTimeOrder", son1, new Object[]{} ));
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException | NoSuchFieldException e) {
e.printStackTrace();
}
}
public static <T> Object getFieldVal(String fieldName, T t) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Class<?> clazz = t.getClass();
String firstLetter = fieldName.substring(0, 1).toUpperCase();
String getter = "get" + firstLetter + fieldName.substring(1);
Method method = clazz.getMethod(getter);
return method.invoke(t);
}
public static boolean compare(Object one,Object another) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
Field[] declaredFields = one.getClass().getDeclaredFields();
Field[] anotherDeclaredFields = another.getClass().getDeclaredFields();
for (int i = 0; i < declaredFields.length; i++) {
String obj = getFieldVal(declaredFields[i].getName(),one)!=null ? getFieldVal(declaredFields[i].getName(),one).toString():"";
String anotherObj = getFieldVal(anotherDeclaredFields[i].getName(),another)!=null ? getFieldVal(anotherDeclaredFields[i].getName(),another).toString():"";
if(!(obj.equals(anotherObj))){
return false;
}
}
return true;
}
public static <T> Object call(String methodName, T t, Object args[]) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Class<?> clazz = t.getClass();
Method method = clazz.getMethod(methodName);
return method.invoke(t, args);
}
public static List<Field> getAllField(Class<?> clazz) {
List<Field> list = new ArrayList<>();
Class<?> type = clazz;
while (!Object.class.equals(type) && type != null) {
Field[] fields = type.getDeclaredFields();
list.addAll(Arrays.asList(fields));
type = type.getSuperclass();
}
return list;
}
public static <T,T1> Map<String, Object> convert2Map(T t) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
Class<?> clazz = t.getClass();
List<Field> allField = getAllField(clazz);
Map<String, Object> entityMap = new HashMap<>();
if(allField.size() <= 0){
return entityMap;
}
for (Field field : allField) {
String name = field.getName();
Object fieldVal = getFieldVal(name, t);
entityMap.put(name, fieldVal);
}
return entityMap;
}
public static <T> String getAnnotation(T t, String fieldName) throws NoSuchFieldException {
Class<?> clazz = t.getClass();
Field field = clazz.getDeclaredField(fieldName);
XmlModelDesc modelDesc = field.getAnnotation(XmlModelDesc.class);
return modelDesc.value();
}
public static <T,T1 extends Comparable<T1> > void sort(List<T> list, String sortFieldName){
Collections.sort(list, (o1, o2) -> {
T1 val1 = null;
T1 val2 = null;
try {
Object o1Val = getFieldVal(sortFieldName, o1);
Object o2Val = getFieldVal(sortFieldName, o2);
val1 = (T1)o1Val;
val2 = (T1)o2Val;
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
if (val1 == null && val2 ==null){
return 0;
}
if(val1 == null){
return 1;
}
if(val2 == null){
return -1;
}
return val1.compareTo(val2);
});
}
static class ReflectTest{
private String name;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
static class ReflectTestSon extends ReflectTest{
private String age;
public Date getTimeOrder() {
return timeOrder;
}
public void setTimeOrder(Date timeOrder) {
this.timeOrder = timeOrder;
}
@XmlModelDesc(value = "日期")
private Date timeOrder ;
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
}
set
private <T> Object getFieldVal(String fieldName, T t) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Class<?> clazz = t.getClass();
String firstLetter = fieldName.substring(0, 1).toUpperCase();
String getter = "get" + firstLetter + fieldName.substring(1);
Method method = clazz.getMethod(getter);
return method.invoke(t);
}
private <T,T1> Object setFieldVal(String fieldName, T t, Class<T1> clazzType, T1 val) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Class<?> clazz = t.getClass();
String firstLetter = fieldName.substring(0, 1).toUpperCase();
String setter = "set" + firstLetter + fieldName.substring(1);
Method method = clazz.getMethod(setter, clazzType);
return method.invoke(t, val);
}
action
protected ModelAndView handle(HttpServletRequest request,HttpServletResponse response) throws Exception {
try {
String actionType=request.getParameter("actionType");
if(paramBlank(actionType)){
return buildErrResult("actionType_is_null");
}
Class<? extends PolicySendController> clazz = this.getClass();
Method actionMethod = clazz.getDeclaredMethod(actionType, HttpServletRequest.class,HttpServletResponse.class);
ModelAndView invokeResult = (ModelAndView)actionMethod.invoke(this, request,response);
return invokeResult;
} catch (Exception e) {
e.printStackTrace();
logger.error("send_ele_policy_error:" +e.getMessage(), e);
return buildErrResult("系统异常");
}
}