sanity checks for class names

load method/field info from reflection


git-svn-id: https://svn.code.sf.net/p/jode/code/trunk@571 379699f6-c40d-0410-875b-85095c16579e
stable
jochen 26 years ago
parent 2e61da9b5f
commit 4ff13e22dd
  1. 64
      jode/jode/bytecode/ClassInfo.java

@ -18,6 +18,7 @@
*/ */
package jode.bytecode; package jode.bytecode;
import jode.Type;
import jode.MethodType; import jode.MethodType;
import java.io.*; import java.io.*;
import java.util.*; import java.util.*;
@ -25,6 +26,8 @@ import java.util.*;
///import java.lang.ref.WeakReference; ///import java.lang.ref.WeakReference;
///import java.lang.ref.ReferenceQueue; ///import java.lang.ref.ReferenceQueue;
///#endif ///#endif
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier; 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 * 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 * from a stream containing the .class file, and that it uses the
* <code>jode.Type</code> to represent types instead of Class itself. * <code>Type</code> to represent types instead of Class itself.
* *
* @author Jochen Hoenicke * @author Jochen Hoenicke
*/ */
@ -114,9 +117,12 @@ public class ClassInfo extends BinaryInfo {
} }
public static ClassInfo forName(String name) { public static ClassInfo forName(String name) {
if (name == null) // name = name.replace('/', '.');
return null; if (name == null
name = name.replace('/', '.'); || name.indexOf(';') != -1
|| name.indexOf('[') != -1
|| name.indexOf('/') != -1)
throw new IllegalArgumentException("Illegal class name: "+name);
///#ifdef JDK12 ///#ifdef JDK12
/// java.lang.ref.Reference died; /// java.lang.ref.Reference died;
/// while ((died = queue.poll()) != null) { /// while ((died = queue.poll()) != null) {
@ -166,8 +172,8 @@ public class ClassInfo extends BinaryInfo {
String name = cpool.getClassName(input.readUnsignedShort()); String name = cpool.getClassName(input.readUnsignedShort());
if (!this.name.equals(name)) if (!this.name.equals(name))
new ClassFormatException("Class has wrong name: "+name); new ClassFormatException("Class has wrong name: "+name);
superclass = ClassInfo.forName String superName = cpool.getClassName(input.readUnsignedShort());
(cpool.getClassName(input.readUnsignedShort())); superclass = superName != null ? ClassInfo.forName(superName) : null;
} }
private void readInterfaces(ConstantPool cpool, private void readInterfaces(ConstantPool cpool,
@ -224,7 +230,6 @@ public class ClassInfo extends BinaryInfo {
} }
public void loadInfoReflection(int howMuch) { public void loadInfoReflection(int howMuch) {
try { try {
Class clazz = Class.forName(name); Class clazz = Class.forName(name);
modifiers = clazz.getModifiers(); modifiers = clazz.getModifiers();
@ -240,13 +245,52 @@ public class ClassInfo extends BinaryInfo {
interfaces[i] = ClassInfo.forName(ifaces[i].getName()); interfaces[i] = ClassInfo.forName(ifaces[i].getName());
status |= HIERARCHY; 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 jode.Decompiler.err.println
("Can't find class " + name ("Could only get public fields of class "
+ " in classpath. Bad things may or may not happen."); + 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. "+
"Can't load everything from reflection: "+howMuch);
status |= 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) { } catch (ClassNotFoundException ex) {
// Nothing helped, ``guess'' the hierarchie // Nothing helped, ``guess'' the hierarchie
String message = ex.getMessage(); String message = ex.getMessage();

Loading…
Cancel
Save