Provides easy access to class files and their contents. To use it you
create a ClassPath
object giving it the locations where
it should search for classes. Then you can ask this object for a
class and get a ClassInfo object. As third step you can actually load
the class.
Please notify me if you want to use this package. I will inform you
about updates, help you with problems, etc. WARNING: Some
parts of this package may change in the future in incompatible ways.
Ask me for more information.
Here is a short example, how you can use this package, see the
documentation of the classes for more details.
...
ClassPath path = new ClassPath("/usr/lib/java/lib/classes.zip");
ClassInfo clazz = path.getClassInfo("java.util.Hashtable");
try {
clazz.load(ClassInfo.DECLARATIONS);
} catch (ClassFormatException ex) {
System.err.println("Something is wrong with HashTable, giving up!");
return;
} catch (IOException ex) {
System.err.println("Can't load HashTable, giving up!");
return;
}
MethodInfo[] methods = clazz.getMethods();
for (int i = 0; i < methods.length; i++) {
String type = methods[i].getType();
if (TypeSignature.getReturnType(type) == TypeSignature.INT_TYPE)
System.out.println("Found integer method: "+method.getName());
}
...
You can also use this package to create and write new classes:
...
ClassPath path = new ClassPath("/usr/lib/java/lib/classes.zip");
ClassInfo clazz = path.getClassInfo("my.new.Class");
clazz.setModifiers(Modifier.PUBLIC);
clazz.setSourceFile("Class.pl");
clazz.set...
clazz.write(zipOutputStream);
...
- You don't need to think of the constant pool, except when you want
to write your custom attributes.
- The set of opcodes is drastically reduced: For example you don't
have to handle 20 different opcodes that all push a constant value on
the stack. When reading it will automatically convert them to
ldc
or ldc2
and on writing it will convert
them back.
- Wide instructions are automatically generated when needed, large
methods are supported.
- The code is organized in {@link net.sf.jode.bytecode.BasicBlocks}
which makes flow analysis much easier.
- The memory consumption is quite moderate.
Disadvantages
- You can't change every byte. For example Jode decides itself if
a lookup switch or table switch is generated.
- Jode does a lot of checks when reading the bytecode and it is
impossible to recover from errors. This makes it sometime hard to
find out why the bytecode of a particular class files is invalid.
Jochen Hoenicke
Last modified: Sat Aug 11 18:44:19 MEST 2001