反射与泛型

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 "";
}

  • ReflectUtil.java
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);
        //   field.getAnnotatedType();
        // field.isAnnotationPresent(XmlModelDesc.class);
        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 {
                /*
                Map<String, Object> o1Map = ReflectUtil.convert2Map(o1);
                Map<String, Object> o2Map = ReflectUtil.convert2Map(o2);
                Object o1Val = o1Map.get(sortFieldName);
                Object o2Val = o2Map.get(sortFieldName);*/
                Object o1Val = getFieldVal(sortFieldName, o1);
                Object o2Val = getFieldVal(sortFieldName, o2);
                // Class<?> clazz = fieldType.getClass();
                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");
		}
		
		//doSendSMSOrEmail(request);
		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("系统异常");
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值