AspectJ API的内部NullPointException是什么意思?

时间:2015-10-23 03:45:41

标签: aspectj

我写了一些代码来使用ajc API编写二进制代码。这是:

// assemble compile options
String[] args = {
        "-1.7",
        "-showWeaveInfo",
        "-encoding", "UTF-8",
        "-inpath", inpath,
        "-d", output.getOutFile().getAbsolutePath(),
        "-bootclasspath", bootpath};

// run compile
MessageHandler handler = new MessageHandler(true);
new Main().run(args, handler);

我的目的是将所有项目二进制代码编织在一起。我在Gradle中将它用于我的Android项目。 但它引发了NPE:

---- AspectJ Properties ---
AspectJ Compiler 1.8.7 built on Wednesday Sep 9, 2015 at 21:19:30 GMT
---- Dump Properties ---
Dump file: ajcore.20151022.173902.134.txt
Dump reason: java.lang.NullPointerException
Dump on exception: true
Dump at exit condition: abort
---- Exception Information ---
java.lang.NullPointerException
at org.aspectj.weaver.AbstractReferenceTypeDelegate.getFormalTypeParametersFromOuterClass(AbstractReferenceTypeDelegate.java:111)
at org.aspectj.weaver.bcel.BcelObjectType.ensureGenericSignatureUnpacked(BcelObjectType.java:772)
at org.aspectj.weaver.bcel.BcelObjectType.getSuperclass(BcelObjectType.java:231)
at org.aspectj.weaver.ReferenceType.getSuperclass(ReferenceType.java:987)
at org.aspectj.weaver.bcel.BcelWeaver.weaveParentsFor(BcelWeaver.java:1300)
at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1119)
at org.aspectj.ajdt.internal.compiler.AjPipeliningCompilerAdapter.weaveQueuedEntries(AjPipeliningCompilerAdapter.java:514)
at org.aspectj.ajdt.internal.compiler.AjPipeliningCompilerAdapter.afterCompiling(AjPipeliningCompilerAdapter.java:375)
at org.aspectj.ajdt.internal.compiler.CompilerAdapter.ajc$afterReturning$org_aspectj_ajdt_internal_compiler_CompilerAdapter$2$f9cc9ca0(CompilerAdapter.aj:78)
at org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:471)
at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performCompilation(AjBuildManager.java:1036)
at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performBuild(AjBuildManager.java:272)
at org.aspectj.ajdt.internal.core.builder.AjBuildManager.batchBuild(AjBuildManager.java:185)
at org.aspectj.ajdt.ajc.AjdtCommand.doCommand(AjdtCommand.java:114)
at org.aspectj.ajdt.ajc.AjdtCommand.runCommand(AjdtCommand.java:60)
at org.aspectj.tools.ajc.Main.run(Main.java:371)
at com.meituan.android.aspectj.AspectJTransform.transform(AspectJTransform.java:105)
at com.android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:117)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:75)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$IncrementalTaskAction.doExecute(AnnotationProcessingTaskFactory.java:243)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:219)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$IncrementalTaskAction.execute(AnnotationProcessingTaskFactory.java:230)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:208)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)
at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53)
at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:203)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:185)
at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:62)
at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:50)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

所以我做了一些故障排除,我认为这是BcelObjectType.getOuterClass()中出错的地方:

// try finding outer class name by assuming standard class name mangling convention of javac for this class
int lastDollar = className.lastIndexOf('$');
if (lastDollar == -1) {
    // Is this class damaged/obfuscated? Why did we think it was nested but couldn't find the parent using
    // the attributes above. For now just ignore it... I wonder when ignoring this will come back to bite!
    return null;
}

最有趣的是构建代码在我的演示中工作但在一个复杂的项目中失败(一个有更多的库依赖项)。由于我不是AspectJ开发人员,我根本不知道这里发生了什么。那么有谁能告诉我这个例外意味着什么?当这个异常发生时,人们会有任何典型的错误吗?

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题并为它引发了错误482945

在我的情况下,它是由一个特定的内部类引起的,该内部类被混淆到外部类不再是内部类的名称(外部$ inner)。仍然,由于某种原因,底层BCEL代码确定它是一个内部类并试图确定外部类。其他类似的混淆类不会给出相同的错误。

在命令行上运行项目时,将打印出作为原因的类。由于某种原因,它不在ajcore文件中。

我的解决方法是在我的aop.xml文件中排除特定类的编织,因为我知道它不受我的方面的影响:

<weaver options="-nowarn -Xlint:ignore">
  <exclude within="com.tibco.xml.parsers.xmlfactories.b"/>
</weaver>

请注意,为什么只在复杂的项目中遇到问题也很清楚。导致这种情况的类很可能出现在另一个只包含在复杂项目中的库中。