博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Reflections - Java 8 - invalid constant type
阅读量:6721 次
发布时间:2019-06-25

本文共 7853 字,大约阅读时间需要 26 分钟。

异常说明

使用Reflections扫描的时候出现could not create class file from, 原因是invalid constant type: 18

异常堆栈:

org.reflections.ReflectionsException: could not create class file from EmployeeDao.class    at org.reflections.adapters.JavassistAdapter.getOfCreateClassObject(JavassistAdapter.java:102)    at org.reflections.adapters.JavassistAdapter.getOfCreateClassObject(JavassistAdapter.java:24)    at org.reflections.scanners.AbstractScanner.scan(AbstractScanner.java:30)    at org.reflections.Reflections.scan(Reflections.java:250)    at org.reflections.Reflections.scan(Reflections.java:204) at org.reflections.Reflections.
(Reflections.java:129) at org.reflections.Reflections.
(Reflections.java:170) at org.reflections.Reflections.
(Reflections.java:143) at com.mljr.fenqi.crm.core.cache.RedisCacheConfig.parseRedisCacheTTL(RedisCacheConfig.java:63) at com.mljr.fenqi.crm.core.cache.RedisCacheConfig.onApplicationEvent(RedisCacheConfig.java:40) at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:163) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:136) at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:381) at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:335) at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:855) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541) at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:125) at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:60) at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:109) at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:261) at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98) at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116) at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:83) at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:117) at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83) at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:228) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:230) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:249) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) at org.junit.runners.ParentRunner.run(ParentRunner.java:309) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:193) at org.junit.runner.JUnitCore.run(JUnitCore.java:160) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:119) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42) at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74) Caused by: java.io.IOException: invalid constant type: 18 at javassist.bytecode.ConstPool.readOne(ConstPool.java:1113) at javassist.bytecode.ConstPool.read(ConstPool.java:1056) at javassist.bytecode.ConstPool.
(ConstPool.java:150) at javassist.bytecode.ClassFile.read(ClassFile.java:765) at javassist.bytecode.ClassFile.
(ClassFile.java:109) at org.reflections.adapters.JavassistAdapter.getOfCreateClassObject(JavassistAdapter.java:100) ... 45 more
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55

看了一篇文章说是 代码中是用的解析字节码的库 既不兼容jdk1.8 甚至可能都不兼容jdk1.7, 如果编译器没问题,那问题就在这个解析字节码的库

If you look at this table, you’ll see that “constant type: 18” refers to the CONSTANT_InvokeDynamic attribute whose tag value is 18.

So you are using a library which has a class parser which is not Java 8 compatible. Actually, this class parser even isn’t Java 7 compatible as this constant value is specified since Java 7. It just got away with that as ordinary Java code doesn’t use this feature in Java 7. But when interacting with code produced by different programming languages for the JVM, it could even fail with Java 7.

There’s an item in the bug tracker of Reflections describing your problem. At the bottom, you will find the notice:

解决方案

由于Reflections解析字节码使用了javassist库, 换个版本试试,解决问题的版本 javassist-3.18.2-GA,如果其他的库有依赖javasist的,需要统一版本,就需要exclusion

pom.xml

org.reflections
reflections
0.9.10
javassist
javassist
org.javassist
javassist
3.18.2-GA
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

扫描代码:

Map
map = new HashMap<>();ConfigurationBuilder builder = new ConfigurationBuilder() .filterInputsBy(new FilterBuilder().includePackage("com.mljr.fenqi.crm")) .addUrls(ClasspathHelper.forPackage("com.mljr")) .setScanners(new MethodAnnotationsScanner(), new TypeAnnotationsScanner(), new TypeElementsScanner(), new SubTypesScanner()); Reflections reflections = new Reflections(builder); Set
> annotated = reflections.getTypesAnnotatedWith(RedisCache.class); for (Class
serviceClass : annotated) { RedisCache typeRedisCache = serviceClass.getAnnotation(RedisCache.class); if (typeRedisCache != null ) { for (String name : typeRedisCache.cacheNames()) { map.put(name, typeRedisCache.expire()); } } } Set
annotatedMethod = reflections.getMethodsAnnotatedWith(RedisCache.class); for (Method method : annotatedMethod) { RedisCache methodRedisCache = method.getAnnotation(RedisCache.class); if (methodRedisCache != null ) { for (String name : methodRedisCache.cacheNames()) { map.put(name, methodRedisCache.expire()); } } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

REF

转载地址:http://mecmo.baihongyu.com/

你可能感兴趣的文章
NYIST OJ 题目20 吝啬的王国
查看>>
在500jsp错误页面获取错误信息
查看>>
python常见示例->web简单示例
查看>>
centos7下安装部署mongodb集群(副本集模式)
查看>>
[BZOJ] 1334: [Baltic2008]Elect
查看>>
Jquery对象---Jquery API (2)
查看>>
PHP ReflectionClass
查看>>
swift历史
查看>>
mysql导入大量数据时报MySQL server has gone away错误的解决办法
查看>>
socket简单理解
查看>>
过滤HTML
查看>>
临时表 表变量 游标
查看>>
关于 iTunes Store 授权和取消授权
查看>>
React文档(十三)思考React
查看>>
公司部门和职位
查看>>
python内置函数中的map,filter,reduce函数例子
查看>>
我的Android进阶之旅------>对Java中注释/**@hide*/的初步认识
查看>>
mybatis--Mapper 常见报错总结(持续总结)
查看>>
一个农民工写的Json组件,让大神们情何以堪.
查看>>
Python3向网页POST数据
查看>>