枚举中传入当前的枚举对象反编译后取不出枚举列表

今天前台说,获取枚举的接口拿不到值了,让后台看下,代码如下:

@PostMapping(value = "/enums")
    public String enumList(){
    	try {
    		ResourcePatternResolver resolver = ResourcePatternUtils.getResourcePatternResolver(resourceLoader);
            MetadataReaderFactory metaReader = new CachingMetadataReaderFactory(resourceLoader);
            Resource[] resources = resolver.getResources("classpath*:com/ses/common/api/enums/**/E*.class");
            Map enumObject = new HashMap();
            for (Resource r : resources) {
                MetadataReader reader = metaReader.getMetadataReader(r);
                ClassMetadata classd = reader.getClassMetadata();
                Class clazz = Class.forName(classd.getClassName());
                Object[] objs = clazz.getEnumConstants();
                List detailEnum = new ArrayList();
                for (Object objt : objs) {
                	Map map = new HashMap();
                    map.put("displayName", getValue(objt, "getDisplayName"));
                    map.put("value", getValue(objt, "getValue"));
                    map.put("name", getValue(objt, "name"));
                    //过滤此枚举
                    if (null != getValue(objt, "name") && !EAttachmentType.CONTACTS_ID_BACK.name().equals(getValue(objt, "name")) && !EAttachmentType.LEGAL_ID_BACK.name().equals(getValue(objt, "name"))){
                        detailEnum.add(map);
                    }
                }
                if (!CollectionUtils.isEmpty(detailEnum)) {
                    enumObject.put(lowerFirstChar(clazz.getSimpleName()), detailEnum);
                }
            }
            return ReturnUtil.returnSucc(enumObject);
		} catch (Exception e) {
			return null;
		}
    } 
  

眉头一皱,看到异常捕获返回一个null,有点无语。

这个方法取公共包下E开头的class文件,通过反射方式获取枚举类型并返回

简单debug了下,发现是 clazz.getEnumConstants()这个方法返回null,往上跟,发现是

Class.forName(classd.getClassName()) 中Reflection.getCallerClass()这里面返回的对象的enumConstants为空,往下没有调用链了,那么Reflection.getCallerClass()这个类做了什么事情呢?Reflection.getCallerClass()是把class文件中的属性取出来,enumConstants表示什么属性呢?百度了一下,这个是判断当前这个类的类型,为空则不是枚举类型。我这明明是个枚举类型,怎么就被判断为非枚举类型?之前没见出现这种问题,是不是最近修改引起的,排查最近修改的代码,最近加的一段代码,将这个对象作为入参条件写了一个静态方法,是不是这个引起的呢?

把这段代码屏蔽,重新跑用例,OK 返回正常,那就是这段代码引起的,那看看class文件里面怎么处理的,为什么加了一个静态方法就出现问题,上面也有一个静态方法,就没有问题呢?首先下载Classpy(查看字节码工具),然后执行 Java -jar classpy-0.7.jar,再将编译后的文件拖到打开的工具里面,看起来好像也没有什么异常access_flags = ACC_EUNM说明编译之后还是一个枚举类型,再看看有没有其他的class,又发现了一个EAccountType$1.class,这个class中没有ACC_EUNM这个属性,EAccountType$1.class又是怎么来的呢?原来他是把静态方法入参的EAccountType作为子对象传入,子对象被编译后类型没有被识别为枚举类型,导致出现问题,那没办法了,只能把这个方法提取到公共类里面去了,OK 问题解决

枚举中传入当前的枚举对象反编译后取不出枚举列表_第1张图片

枚举中传入当前的枚举对象反编译后取不出枚举列表_第2张图片

 

你可能感兴趣的:(java,枚举类)