diff options
-rw-r--r-- | src/core/lombok/bytecode/FixedClassWriter.java | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/src/core/lombok/bytecode/FixedClassWriter.java b/src/core/lombok/bytecode/FixedClassWriter.java index 42d8c4c1..528bc79d 100644 --- a/src/core/lombok/bytecode/FixedClassWriter.java +++ b/src/core/lombok/bytecode/FixedClassWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 The Project Lombok Authors. + * Copyright (C) 2010-2012 The Project Lombok Authors. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -21,6 +21,9 @@ */ package lombok.bytecode; +import java.io.InputStream; +import java.util.Arrays; + import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassWriter; @@ -36,6 +39,43 @@ class FixedClassWriter extends ClassWriter { return super.getCommonSuperClass(type1, type2); } catch (Exception e) { return "java/lang/Object"; + } catch (ClassFormatError e) { + ClassLoader cl = this.getClass().getClassLoader(); + if (cl == null) cl = ClassLoader.getSystemClassLoader(); + String message = debugCheckClassFormatErrorIssue(cl, type1) + + debugCheckClassFormatErrorIssue(cl, type2); + throw new ClassFormatError(message); + } + } + + + // This is debug-aiding code in an attempt to find the cause of issue: + // http://code.google.com/p/projectlombok/issues/detail?id=339 + private static String debugCheckClassFormatErrorIssue(ClassLoader cl, String type) { + try { + Class.forName(type.replace('/', '.'), false, cl); + return String.format("Class.forName debug on %s: no issues\n", type); + } catch (ClassFormatError e) { + // expected + } catch (Throwable e) { + return String.format("Class.forName debug on %s: Exception: %s\n", type, e); + } + + try { + InputStream in = cl.getResourceAsStream(type + ".class"); + if (in == null) return String.format("Class.forName debug on %s: Can't find resource %s\n", type, type + ".class"); + try { + int[] firstBytes = new int[4]; + for (int i = 0; i < 4; i++) firstBytes[0] = in.read(); + if (firstBytes[0] == -1) return String.format("Class.forName debug on %s: file size is 0\n", type); + if (firstBytes[3] == -1) return String.format("Class.forName debug on %s: Less than 4 bytes in class file\n", type); + if (!Arrays.equals(new int[] {0xCA, 0xFE, 0xBA, 0xBE}, firstBytes)) return String.format("Class.forName debug on %s: no CAFEBABE: %s\n", type, Arrays.toString(firstBytes)); + return String.format("Class.forName debug on %s: No immediately obvious reason for failure found\n", type); + } finally { + in.close(); + } + } catch (Throwable e) { + return String.format("Class.forName debug on %s: Can't read as stream: %s\n", type, e); } } }
\ No newline at end of file |