diff --git a/jode/jode/bytecode/ClassInfo.java b/jode/jode/bytecode/ClassInfo.java
index d21b567..9041cb4 100644
--- a/jode/jode/bytecode/ClassInfo.java
+++ b/jode/jode/bytecode/ClassInfo.java
@@ -18,6 +18,7 @@
*/
package jode.bytecode;
+import jode.Type;
import jode.MethodType;
import java.io.*;
import java.util.*;
@@ -25,6 +26,8 @@ import java.util.*;
///import java.lang.ref.WeakReference;
///import java.lang.ref.ReferenceQueue;
///#endif
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
/**
@@ -33,7 +36,7 @@ import java.lang.reflect.Modifier;
*
* The main difference to java.lang.Class is, that the objects are builded
* from a stream containing the .class file, and that it uses the
- * jode.Type
to represent types instead of Class itself.
+ * Type
to represent types instead of Class itself.
*
* @author Jochen Hoenicke
*/
@@ -114,9 +117,12 @@ public class ClassInfo extends BinaryInfo {
}
public static ClassInfo forName(String name) {
- if (name == null)
- return null;
- name = name.replace('/', '.');
+// name = name.replace('/', '.');
+ if (name == null
+ || name.indexOf(';') != -1
+ || name.indexOf('[') != -1
+ || name.indexOf('/') != -1)
+ throw new IllegalArgumentException("Illegal class name: "+name);
///#ifdef JDK12
/// java.lang.ref.Reference died;
/// while ((died = queue.poll()) != null) {
@@ -166,8 +172,8 @@ public class ClassInfo extends BinaryInfo {
String name = cpool.getClassName(input.readUnsignedShort());
if (!this.name.equals(name))
new ClassFormatException("Class has wrong name: "+name);
- superclass = ClassInfo.forName
- (cpool.getClassName(input.readUnsignedShort()));
+ String superName = cpool.getClassName(input.readUnsignedShort());
+ superclass = superName != null ? ClassInfo.forName(superName) : null;
}
private void readInterfaces(ConstantPool cpool,
@@ -224,7 +230,6 @@ public class ClassInfo extends BinaryInfo {
}
public void loadInfoReflection(int howMuch) {
-
try {
Class clazz = Class.forName(name);
modifiers = clazz.getModifiers();
@@ -240,13 +245,52 @@ public class ClassInfo extends BinaryInfo {
interfaces[i] = ClassInfo.forName(ifaces[i].getName());
status |= HIERARCHY;
}
- if ((howMuch & ~HIERARCHY) != 0) {
+ if ((howMuch & FIELDS) != 0) {
+ Field[] fs;
+ try {
+ fs = clazz.getDeclaredFields();
+ } catch (SecurityException ex) {
+ fs = clazz.getFields();
+ jode.Decompiler.err.println
+ ("Could only get public fields of class "
+ + name + ".");
+ }
+ fields = new FieldInfo[fs.length];
+ for (int i = fs.length; --i >= 0; ) {
+ Type type = Type.tType(fs[i].getType());
+ fields[i] = new FieldInfo
+ (fs[i].getName(), type, fs[i].getModifiers());
+ }
+ }
+ if ((howMuch & METHODS) != 0) {
+ Method[] ms;
+ try {
+ ms = clazz.getDeclaredMethods();
+ } catch (SecurityException ex) {
+ ms = clazz.getMethods();
+ jode.Decompiler.err.println
+ ("Could only get public methods of class "
+ + name + ".");
+ }
+ methods = new MethodInfo[ms.length];
+ for (int i = ms.length; --i >= 0; ) {
+ MethodType type = Type.tMethod
+ (ms[i].getParameterTypes(), ms[i].getReturnType());
+ methods[i] = new MethodInfo
+ (ms[i].getName(), type, ms[i].getModifiers());
+ }
+ }
+ if ((howMuch & ~(FIELDS|METHODS|HIERARCHY)) != 0) {
jode.Decompiler.err.println
- ("Can't find class " + name
- + " in classpath. Bad things may or may not happen.");
+ ("Can't find class " + name + " in classpath. "+
+ "Can't load everything from reflection: "+howMuch);
status |= howMuch;
}
+ } catch (SecurityException ex) {
+ 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();