JOIE

The Java Object Instrumentation Environment

cs.duke.edu :: ISSG :: JOIE last update: 05/01/2003

Overview

JOIE is a framework for safe Java bytecode transformation. It provides both low-level and high-level functionality to extend or adapt compiled Java classes. The low-level interface allows to manipulate the bytecodes itself whereas the high-level interface provides methods for inserting new interfaces, fields, methods or whole code splices.

Goal

Our goal is to provide simple yet powerful interfaces for bytecode transformation whereas implementing safe mechanisms for bytecode manipulation has a top priority. Second, we try to hide as much of the complexity as possible to enable even users unfamiliar with the JVM and bytecode to apply bytecode transformations easily.

Future Work

JOIE is still work in progress and we hope to reach the status "version 1.0" soon.
Furthermore, we are trying to increase the performance and to develop more sophisticated ways of bytecode transformation whereas the latter effort focuses on higher levels of abstraction (e.g. whole program transformations).
There are also ideas of describing transformations in a more independent way (e.g. with XML).

Publications

  • Automatic Program Transformation with JOIE by Geoff Cohen (Duke/IBM), Jeff Chase (Duke), and David Kaminsky (IBM) in Proceedings of the 1998 USENIX Annual Technical Symposium. [postscript] [pdf]
  • An Architecture for Safe Bytecode Insertion by Geoff A. Cohen and Jeffrey S. Chase, Duke University (submitted and accepted to Software--Practices & Experience) [pdf]

Projects using JOIE

Current projects

Past projects

  • Safkasi - Security Mechanism for Language-based Systems
  • Naccio - Policy-Directed Code Safety

Related Work

There are different projects and API's that deal with Java bytecode transformation. Although they all seem to have similar goals the functionality might differ significantly.

Aspect Oriented Programming (AOP) is a concept that might be compared to bytecode transformation. In fact, AOP has a completely different approach (it extends the semantics of the Java programming language and the transformation is applied at compile time) but the results are similar.