有业务需要解析excel,
各个String类型对应成为int类型保存入库,枚举已有,且基本上都有getInstance 与 获取属性的方法,避免重复的代码,可以使用方法传参或者是反射的方式,使用反射的方式代码最为整洁,但效率偏低
package com.example;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.function.Function;
import java.util.function.Supplier;
public class Test {
public static void main(String[] args) {
long l = System.currentTimeMillis();
System.out.println("方法反射方式 开始");
for (int i = 0; i < 10000000; i++) {
test(ProductEnum::getInstance, "一", ProductEnum::getCodeText);
}
System.out.println("方法反射方式 结束:" + (System.currentTimeMillis() - l));
l = System.currentTimeMillis();
System.out.println("反射方式 开始");
for (int i = 0; i < 10000000; i++) {
test2(ProductEnum.class, "一");
}
System.out.println("反射方式 结束:" + (System.currentTimeMillis() - l));
l = System.currentTimeMillis();
System.out.println("正常方式 开始");
for (int i = 0; i < 10000000; i++) {
ProductEnum productEnum = ProductEnum.getInstance("一");
Integer codeValue = productEnum.getCodeValue();
}
System.out.println("正常方式 开始:" + (System.currentTimeMillis() - l));
}
// 传递方法
public static <T,V,S> S test(EnumInteger<T,V> enumInteger, T t, Function<V, S> function){
S apply = function.apply(enumInteger.getEnum(t));
return apply;
}
// 反射
public static<T> Integer test2(Class<T> classEnum, String s){
Method[] methods = classEnum.getMethods();
Method getInstance;
try {
getInstance = classEnum.getMethod("getInstance", String.class);
Object invoke = getInstance.invoke(classEnum, s);
if (invoke == null) {
return null;
}
Method getCodeValue = invoke.getClass().getMethod("getCodeValue");
Object invoke1 = getCodeValue.invoke(invoke);
return (int)invoke1;
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
for (Method method : methods) {
System.out.println(method.getName());
}
return null;
}
}
方法反射方式 开始
方法反射方式 结束:128
反射方式 开始
反射方式 结束:9073
正常方式 开始
正常方式 开始:49
Process finished with exit code 0