Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用InvocationHandler和invoke在代理类中找到NoClassDef_Java_Reflection_Classloader_Proxy Classes_Method Invocation - Fatal编程技术网

Java 使用InvocationHandler和invoke在代理类中找到NoClassDef

Java 使用InvocationHandler和invoke在代理类中找到NoClassDef,java,reflection,classloader,proxy-classes,method-invocation,Java,Reflection,Classloader,Proxy Classes,Method Invocation,我们正在使用JPA(eclipselink 2.5.2和2.6.2),并且面临一个奇怪的问题: 我们有一些类,它们是通过自身的代理访问的(如本文所述(标记的解决方案):) 现在,我们面临以下问题:在对命名查询调用getResultList()时,我们现在会遇到此异常: Caused by: java.lang.NoClassDefFoundError: Could not initialize class java.lang.reflect.Proxy$ProxyAccessHelper at

我们正在使用JPA(eclipselink 2.5.2和2.6.2),并且面临一个奇怪的问题:

我们有一些类,它们是通过自身的代理访问的(如本文所述(标记的解决方案):)

现在,我们面临以下问题:在对命名查询调用getResultList()时,我们现在会遇到此异常:

Caused by: java.lang.NoClassDefFoundError: Could not initialize class java.lang.reflect.Proxy$ProxyAccessHelper
at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:746)
at com.sap.core.persistence.jdbc.trace.ResultSetProxy.createProxy(ResultSetProxy.java:27)
at com.sap.core.persistence.jdbc.trace.TraceablePreparedStatement.executeQuery(TraceablePreparedStatement.java:78)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeSelect(DatabaseAccessor.java:1007)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:642)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:558)
at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:1991)
at org.eclipse.persistence.sessions.server.ServerSession.executeCall(ServerSession.java:570)
at org.eclipse.persistence.sessions.server.ClientSession.executeCall(ClientSession.java:250)
at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:242)
at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:228)
at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeSelectCall(DatasourceCallQueryMechanism.java:299)
at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.selectAllRows(DatasourceCallQueryMechanism.java:694)
at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRowsFromTable(ExpressionQueryMechanism.java:2738)
at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRows(ExpressionQueryMechanism.java:2691)
at org.eclipse.persistence.queries.ReadAllQuery.executeObjectLevelReadQuery(ReadAllQuery.java:495)
at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeDatabaseQuery(ObjectLevelReadQuery.java:1168)
at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:899)
at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1127)
at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:403)
at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1215)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2896)
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1793)
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1775)
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1740)
at org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:258)
at org.eclipse.persistence.internal.jpa.QueryImpl.getResultList(QueryImpl.java:469)
我调试了很长一段时间都没有用。使用jpa的方法与定义代理的上下文相同,因此基本上实际的代理类应该存在

编辑:我刚刚注意到这个问题与JPA无关。在代理内部运行方法.getAnnotations()时,我也遇到了同样的问题。我在java stacktrack中得到了与上面相同的异常(糟糕的是,今天下午我没有编辑parseAnnotations之类的东西,当时我有权访问stacktrace)。这意味着这是一些类加载器问题,我无法理解

如果有人有线索,请告诉我

感谢和问候,
Kay发现了这个问题,它与类加载器、可见性和其他东西完全无关:

由于某些原因,我仍然没有弄清楚我的tomcat中的webapps文件夹在重新部署我的软件包时没有得到清理,其中有旧文件和捆绑包等,这导致了上面所看到的异常

手动清理,将其全部部署到tomcat->就像一个魔咒一样工作


我讨厌它,因为这样的任意问题会导致错误。

调用JPA的方法具有可见性,但是JPA库(以及加载它的类加载器)对代理类是否具有可见性?我如何才能找到这一点?使用的所有东西基本上都在同一个项目中,jpa是通过maven添加的,所有东西都作为war文件部署在tomcat上,因此jpa应该可以看到该项目中的类。顺便说一句,我后来注意到了一个类似的问题:在代理中还对方法注释进行了一些检查(代理的实际目的是检查这些注释)。但是,当调用Method.getAnnotations()时,会引发与上述相同的异常,这表明这不是JPA问题,而是其他一些类加载问题。