$$ 和 <generated> 在 Java 堆栈跟踪中是什么意思?
What does $$ and <generated> mean in Java stacktrace?
我经常得到这样的堆栈跟踪(请查看箭头中的混淆行):
org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [PRIMARY]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
at org.springframework.orm.hibernate5.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:164)
at org.springframework.orm.hibernate5.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:741)
at org.springframework.orm.hibernate5.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:589)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:761)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:730)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:485)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:291)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653)
---------> at com.panpwr.admin.services.detector.SimpleDetectorPersistenceService$$EnhancerBySpringCGLIB$303639.saveComplexRuleAndActionTemplates(<generated>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
...
...
...
$$
符号是什么意思,这一行的'generated'是什么意思?
com.panpwr.admin.services.detector.SimpleDetectorPersistenceService$$EnhancerBySpringCGLIB$303639.saveComplexRuleAndActionTemplates(<generated>)
为什么只说执行的方法而不说其中的行号?
$
是 class 名称中允许的字符。
名称 SimpleDetectorPersistenceService$$EnhancerBySpringCGLIB$303639
暗示它是 class 由 Spring 框架使用 CGLIB 在运行时动态生成的。
他们使用 $$
和数字偏移来使这个 class 名称唯一,以避免与现有的 classes 冲突。
stracktrace 中的字符串 (<generated>)
也是由 CGLIB:
生成的
当 CGLIB 在运行时创建 class 时,它使用 <generated>
作为源文件名称的占位符。堆栈跟踪然后简单地打印这个字符串而不是真正的源文件和行号。
我经常得到这样的堆栈跟踪(请查看箭头中的混淆行):
org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [PRIMARY]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
at org.springframework.orm.hibernate5.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:164)
at org.springframework.orm.hibernate5.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:741)
at org.springframework.orm.hibernate5.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:589)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:761)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:730)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:485)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:291)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653)
---------> at com.panpwr.admin.services.detector.SimpleDetectorPersistenceService$$EnhancerBySpringCGLIB$303639.saveComplexRuleAndActionTemplates(<generated>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
...
...
...
$$
符号是什么意思,这一行的'generated'是什么意思?
com.panpwr.admin.services.detector.SimpleDetectorPersistenceService$$EnhancerBySpringCGLIB$303639.saveComplexRuleAndActionTemplates(<generated>)
为什么只说执行的方法而不说其中的行号?
$
是 class 名称中允许的字符。
名称 SimpleDetectorPersistenceService$$EnhancerBySpringCGLIB$303639
暗示它是 class 由 Spring 框架使用 CGLIB 在运行时动态生成的。
他们使用 $$
和数字偏移来使这个 class 名称唯一,以避免与现有的 classes 冲突。
stracktrace 中的字符串 (<generated>)
也是由 CGLIB:
生成的
当 CGLIB 在运行时创建 class 时,它使用 <generated>
作为源文件名称的占位符。堆栈跟踪然后简单地打印这个字符串而不是真正的源文件和行号。