diff --git a/jode/jode/bytecode/ClassInfo.java b/jode/jode/bytecode/ClassInfo.java index 9041cb4..306e52e 100644 --- a/jode/jode/bytecode/ClassInfo.java +++ b/jode/jode/bytecode/ClassInfo.java @@ -18,8 +18,8 @@ */ package jode.bytecode; -import jode.Type; -import jode.MethodType; +import jode.type.Type; +import jode.type.MethodType; import java.io.*; import java.util.*; ///#ifdef JDK12 @@ -169,9 +169,9 @@ public class ClassInfo extends BinaryInfo { DataInputStream input, int howMuch) throws IOException { modifiers = input.readUnsignedShort(); - String name = cpool.getClassName(input.readUnsignedShort()); - if (!this.name.equals(name)) - new ClassFormatException("Class has wrong name: "+name); + String className = cpool.getClassName(input.readUnsignedShort()); + if (!name.equals(className)) + throw new ClassFormatException("wrong name " + className); String superName = cpool.getClassName(input.readUnsignedShort()); superclass = superName != null ? ClassInfo.forName(superName) : null; } @@ -229,9 +229,8 @@ public class ClassInfo extends BinaryInfo { } } - public void loadInfoReflection(int howMuch) { + public void loadInfoReflection(Class clazz, int howMuch) { try { - Class clazz = Class.forName(name); modifiers = clazz.getModifiers(); if ((howMuch & HIERARCHY) != 0) { if (clazz.getSuperclass() == null) @@ -282,8 +281,9 @@ public class ClassInfo extends BinaryInfo { } if ((howMuch & ~(FIELDS|METHODS|HIERARCHY)) != 0) { jode.Decompiler.err.println - ("Can't find class " + name + " in classpath. "+ - "Can't load everything from reflection: "+howMuch); + ("Can't find class " + name + + " in classpath, and couldn't load everything" + + " from reflection."); status |= howMuch; } @@ -291,27 +291,6 @@ public class ClassInfo extends BinaryInfo { jode.Decompiler.err.println (ex+" while collecting info about class " + name + "."); jode.Decompiler.err.println("Bad things may happen?"); - } catch (ClassNotFoundException ex) { - // Nothing helped, ``guess'' the hierarchie - String message = ex.getMessage(); - if ((howMuch & ~(METHODS|HIERARCHY)) == 0) { - jode.Decompiler.err.println - ("Can't read class " + name + ", types may be incorrect. (" - + ex.getClass().getName() - + (message != null ? ": " + message : "") + ")"); - } else - jode.Decompiler.err.println - ("Can't read class " + name - + "(" + ex.getClass().getName() - + (message != null ? ": " + message : "") + ")"); - - if (name.equals("java.lang.Object")) - superclass = null; - else - superclass = ClassInfo.forName("java.lang.Object"); - interfaces = new ClassInfo[0]; - modifiers = Modifier.PUBLIC; - status = FULLINFO; } } @@ -338,8 +317,36 @@ public class ClassInfo extends BinaryInfo { } catch (IOException ex) { // Try getting the info through the reflection interface // instead. - - loadInfoReflection(howMuch); + Class clazz = null; + try { + clazz = Class.forName(name); + } catch (ClassNotFoundException ex2) { + } catch (NoClassDefFoundError ex2) { + } + if (clazz != null) + loadInfoReflection(clazz, howMuch); + else { + // Nothing helped, ``guess'' the hierarchie + String message = ex.getMessage(); + if ((howMuch & ~(METHODS|HIERARCHY)) == 0) { + jode.Decompiler.err.println + ("Can't read class " + name + ", types may be incorrect. (" + + ex.getClass().getName() + + (message != null ? ": " + message : "") + ")"); + } else + jode.Decompiler.err.println + ("Can't read class " + name + + " (" + ex.getClass().getName() + + (message != null ? ": " + message : "") + ")"); + + if (name.equals("java.lang.Object")) + superclass = null; + else + superclass = ClassInfo.forName("java.lang.Object"); + interfaces = new ClassInfo[0]; + modifiers = Modifier.PUBLIC; + status = FULLINFO; + } } }