bytecode inspection of classes in classpath to determine usage of specified classes/methods etc., e.g. for special @Deprecated annotations with expiry version or check for usage of @Internal elements
java.lang.NoClassDefFoundError: B[some referenced class references from A]
at A[some business class from classpath].(DataRestrictionCategoryType.java:44)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at de.javagil.columbo.internal.BytecodeUtil.typeNameToClass(BytecodeUtil.java:170)
at de.javagil.columbo.internal.BytecodeUtil.taggedTypeNameToClass(BytecodeUtil.java:133)
at de.javagil.columbo.internal.BytecodeUtil.determineParameterTypes(BytecodeUtil.java:112)
at de.javagil.columbo.internal.ClassVisitor.visitMethod(ClassVisitor.java:90)
at de.javagil.columbo.internal.ClassVisitor.visitMethod(ClassVisitor.java:52)
at org.objectweb.asm.ClassReader.accept(Unknown Source)
at org.objectweb.asm.ClassReader.accept(Unknown Source)
at de.javagil.columbo.internal.ClassVisitor.getReferersOfClassName(ClassVisitor.java:131)
at de.javagil.columbo.internal.ClassVisitor.inspect(ClassVisitor.java:122)
at de.javagil.columbo.api.BytecodeInspector.inspect(BytecodeInspector.java:77)
java.lang.NoClassDefFoundError: [some referred class]
at java.lang.Class.getDeclaredFields0(Native Method)
at java.lang.Class.privateGetDeclaredFields(Class.java:2291)
at java.lang.Class.getDeclaredField(Class.java:1880)
at de.javagil.columbo.internal.BytecodeUtil.findField(BytecodeUtil.java:241)
at de.javagil.columbo.internal.MethodVisitor.findField(MethodVisitor.java:159)
at de.javagil.columbo.internal.MethodVisitor.onFieldAccess(MethodVisitor.java:118)
at de.javagil.columbo.internal.MethodVisitor.visitFieldInsn(MethodVisitor.java:90)
at org.objectweb.asm.ClassReader.accept(Unknown Source)
at org.objectweb.asm.ClassReader.accept(Unknown Source)
at de.javagil.columbo.internal.ClassVisitor.getReferersOfClassName(ClassVisitor.java:137)
at de.javagil.columbo.internal.ClassVisitor.inspect(ClassVisitor.java:128)
at de.javagil.columbo.api.BytecodeInspector.inspect(BytecodeInspector.java:77)
de.javagil.columbo.api.InspectionException: could not determine class in type some/not/anymore/existing/ClientClass
at de.javagil.columbo.internal.BytecodeUtil.taggedTypeNameToClass(BytecodeUtil.java:137)
at de.javagil.columbo.internal.MethodVisitor.visitFieldInsn(MethodVisitor.java:86)
at org.objectweb.asm.ClassReader.accept(Unknown Source)
at org.objectweb.asm.ClassReader.accept(Unknown Source)
at de.javagil.columbo.internal.ClassVisitor.getReferersOfClassName(ClassVisitor.java:137)
at de.javagil.columbo.internal.ClassVisitor.inspect(ClassVisitor.java:128)
at de.javagil.columbo.api.BytecodeInspector.inspect(BytecodeInspector.java:77)
currently onMethodNotFound is called when bytecode contains byte#clone() or [B#clone(), which is wrong. Such methods do not really exist in Java, but seem to be special treated in the JVM. Therefore some special treatment is neccessary in columbo as well,
Implementations of ReferenceVisitor have no access to the referrer if some Java element was not found by reflection. Thus the referrer should be passed to the on...NotFound() methods as an argument.
if constructor not found, MethodVisitor.onConstructorCall() calls referenceVisitor.onConstructorCall() with null even though findConstructor() already called onConstructorNotFound()