|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490 |
- <html>
- <HEAD>
- <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
- <TITLE>Read Me First</TITLE>
- </HEAD>
- <body>
-
- <h1>Javassist version 2</h1>
-
- <h3>in May, 2003.
- <br>Copyright (C) 2000-2003 by Shigeru Chiba, All rights reserved.</h3>
-
- <p><br></p>
-
- <p>Javassist (JAVA programming ASSISTant) makes Java bytecode manipulation
- simple. It is a class library for editing bytecodes in Java;
- it enables Java programs to define a new class at runtime and to
- modify a class file when the JVM loads it. Unlike other similar
- bytecode editors, Javassist provides two levels of API: source level
- and bytecode level. If the users use the source-level API, they can
- edit a class file without knowledge of the specifications of the Java
- bytecode. The whole API is designed with only the vocabulary of the
- Java language. You can even specify inserted bytecode in the form of
- source text; Javassist compiles it on the fly. On the other hand, the
- bytecode-level API allows the users to directly edit a class file as
- other editors.
-
- <p><br>
-
- <h2>Files</h2>
-
- <ul>
- <table>
- <tr>
- <td><li><tt><a href="License.html">License.html</a></tt></td>
- <td>License file
- (Also see the <a href="#copyright">copyright notices</a> below)</td>
- </tr>
-
- <tr>
- <td><li><tt><a href="tutorial/tutorial.html">tutorial/tutorial.html</a></tt></td>
- <td>Tutorial</td>
- </tr>
-
- <tr>
- <td><li><tt>./javassist.jar</tt></td>
- <td>The Javassist jar file (class files)</td>
- </tr>
-
- <tr>
- <td><li><tt>./src/main</tt></td>
- <td>The source files</td>
- </tr>
-
- <tr>
- <td><li><tt><a href="html/index.html">html/index.html</a></tt></tr>
- <td>The top page of the Javassist API document.</td>
- </tr>
-
- <tr>
- <td><li><tt>./sample/</tt></td>
- <td>Sample programs</td>
- </tr>
- </table>
- </ul>
-
- <p>To extract source files from the archive, use the jar command:<br>
-
- <ul><pre>% jar xvf javassist-src.zip</pre></ul>
-
-
- <p><br>
-
- <h2>How to run sample programs</h2>
-
- <p>JDK 1.2.2 or later is needed.
-
- <h3>1. Move to the directory where this Readme.html file is located.</h3>
-
- <p>In the description below, we assume that the platform is JDK 1.2
- (or later) for Solaris. If the platform is JDK 1.2 (or later) for
- Windows, the class-path option is:
-
- <ul><pre>
- -classpath ".;javassist.jar"
- </pre></ul>
-
- <p>If you don't want to put the class-path option, copy
- <tt>./javassist.jar</tt> to
-
- <ul><<i>java-home</i>><tt>/jre/lib/ext/</tt>.</ul>
-
- <p><<i>java-home</i>> depends on the system. It is usually
- <tt>/usr/local/java</tt>, <tt>c:\jdk1.2\</tt>, etc.
-
- <p>If you don't use javassist.jar, first compile Javassist:
- <ul><pre>
- % cd src
- % javac -d .. javassist/*.java javassist/*/*.java
- % cd ..
- </pre></ul>
-
- <p>Then you can compile and run the sample programs without the class-path
- option.
-
- <h3>2. sample/Test.java</h3>
-
- <p> This is a very simple program using Javassist.
-
- <p> To run, type the commands:
-
- <ul><pre>
- % javac -classpath ".:javassist.jar" sample/Test.java
- % java -cp ".:javassist.jar" sample.Test
- </pre></ul>
-
- <p> For more details, see <a type="text/plain" href="sample/Test.java">sample/Test.java</a>
-
- <h3>3. sample/reflect/*.java</h3>
-
- <p> This is the "verbose metaobject" example well known in reflective
- programming. This program dynamically attaches a metaobject to
- a Person object. The metaobject prints a message if a method
- is called on the Person object.
-
- <p> To run, type the commands:
-
- <ul><pre>
- % javac -classpath ".:javassist.jar" sample/reflect/*.java
- % java -cp ".:javassist.jar" javassist.reflect.Loader sample.reflect.Main Joe
- </pre></ul>
-
- <p>Compare this result with that of the regular execution without reflection:
-
- <ul><pre>% java -cp ".:javassist.jar" sample.reflect.Person Joe</pre></ul>
-
- <p> For more details, see <a type="text/plain" href="sample/reflect/Main.java">sample/reflect/Main.java</a>
-
- <p> Furthermore, the Person class can be statically modified so that
- all the Person objects become reflective without sample.reflect.Main.
- To do this, type the commands:
-
- <ul><pre>
- % java -cp ".:javassist.jar" javassist.reflect.Compiler sample.reflect.Person -m sample.reflect.VerboseMetaobj
- </pre></ul>
-
- <p> Then,
- <ul><pre>
- % java -cp ".:javassist.jar" sample.reflect.Person Joe
- </pre></ul>
-
- <h3>4. sample/duplicate/*.java</h3>
-
- <p> This is another example of reflective programming.
-
- <p> To run, type the commands:
-
- <ul><pre>
- % javac -classpath ".:javassist.jar" sample/duplicate/*.java
- % java -cp ".:javassist.jar" sample.duplicate.Main
- </pre></ul>
-
- <p>Compare this result with that of the regular execution without reflection:
-
- <ul><pre>% java sample.duplicate.Viewer</pre></ul>
-
- <p>For more details, see
- <a type="text/plain" href="sample/duplicate/Main.java">sample/duplicate/Main.java</a>
-
- <h3>5. sample/vector/*.java</h3>
-
- <p>This example shows the use of Javassit for producing a class representing
- a vector of a given type at compile time.
- This is a demonstration of the use of <tt>javassist.preproc</tt> package.
-
- <p> To run, type the commands:
- <ul><pre>
- % javac -classpath ".:javassist.jar" sample/vector/*.java
- % java -cp ".:javassist.jar" javassist.preproc.Compiler sample/vector/Test.j
- % javac sample/vector/Test.java
- % java sample.vector.Test
- </pre></ul>
-
- <p>For more details, see
- <a type="text/plain" href="sample/vector/Test.j">sample/vector/Test.j</a>
- and <a type="text/plain" href="sample/vector/VectorAssistant.java">sample/vector/VectorAssistant.java</a>
-
- <h3>6. sample/rmi/*.java</h3>
-
- <p> This demonstrates the javassist.rmi package.
-
- <p> To run, type the commands:
- <ul><pre>
- % javac -classpath ".:javassist.jar" sample/rmi/*.java
- % java -cp ".:javassist.jar" sample.rmi.Counter 5001
- </pre></ul>
-
- <p> The second line starts a web server listening to port 5001.
-
- <p> Then, open <a href="sample/rmi/webdemo.html">sample/rmi/webdemo.html</a>
- with a web browser running
- on the local host. (<tt>webdemo.html</tt> trys to fetch an applet from
- <tt>http://localhost:5001/</tt>, which is the web server we started above.)
-
- <p> Otherwise, run sample.rmi.CountApplet as an application:
-
- <ul><pre>
- % java -cp ".:javassist.jar" javassist.web.Viewer localhost 5001 sample.rmi.CountApplet
- </pre></ul>
-
- <h3>7. sample/evolve/*.java</h3>
-
- <p> This is a demonstration of the class evolution mechanism implemented
- with Javassist. This mechanism enables a Java program to reload an
- existing class file under some restriction.
-
- <p> To run, type the commands:
- <ul><pre>
- % javac -classpath ".:javassist.jar" sample/evolve/*.java
- % java -cp ".:javassist.jar" sample.evolve.DemoLoader 5003
- </pre></ul>
-
- <p> The second line starts a class loader DemoLoader, which runs a web
- server DemoServer listening to port 5003.
-
- <p> Then, open <a href="http://localhost:5003/demo.html">http://localhost:5003/demo.html</a> with a web browser running
- on the local host.
- (Or, see <a href="sample/evolve/start.html">sample/evolve/start.html</a>.)
-
- <h3>8. Hints</h3>
-
- <p>Javassist provides a class file viewer for debugging. For more details,
- see javassist.Dump.
-
- <p><br>
-
- <h2>Changes</h2>
-
- <p>- version 2.5 in May, 2003.
- <br>From this version, Javassist is part of the JBoss project.
- <ul>
- <li>The license was changed from MPL to MPL/LGPL dual.
- <li>ClassPool.removeClassPath() and ClassPath.close() have been added.
- <li>ClassPool.makeClass(InputStream) has been added.
- <li>javassist.expr.Handler has been added.
- <li>CtMethod.isEmpty() and CtConstructor.isEmpty() have been added.
- <li>LoaderClassPath has been implemented.
- </ul>
-
- <p>- version 2.4 in February, 2003.
- <ul>
- <li>The compiler included in Javassist did not correctly work with
- interface methods. This bug was fixed.
- <li>Now javassist.bytecode.Bytecode allows more than 255 local
- variables in the same method.
- <li>javassist.expr.Instanceof and Cast have been added.
- <li>javassist.expr.{MethodCall,NewExpr,FieldAccess,Instanceof,Cast}.where()
- have been added. They return the caller-side method surrounding the
- expression.
- <li>javassist.expr.{MethodCall,NewExpr,FieldAccess,Instanceof,Cast}.mayThrow()
- have been added.
- <li>$class has been introduced.
- <li>The parameters to replaceFieldRead(), replaceFieldWrite(),
- and redirectFieldAccess() in javassist.CodeConverter are changed.
- <li>The compiler could not correctly handle a try-catch statement.
- This bug has been fixed.
- </ul>
-
- <p>- version 2.3 in December, 2002.
- <ul>
- <li>The tutorial has been revised a bit.
- <li>SerialVersionUID class was donated by Bob Lee. Thanks.
- <li>CtMethod.setBody() and CtConstructor.setBody() have been added.
- <li>javassist.reflect.ClassMetaobject.useContextClassLoader has been added.
- If true, the reflection package does not use Class.forName() but uses
- a context class loader specified by the user.
- <li>$sig and $type are now available.
- <li>Bugs in Bytecode.write() and read() have been fixed.
- </ul>
-
- <p>- version 2.2 in October, 2002.
- <ul>
- <li>The tutorial has been revised.
- <li>A new package <code>javassist.expr</code> has been added.
- This is replacement of classic <code>CodeConverter</code>.
- <li>javassist.ConstParameter was changed into
- javassist.CtMethod.ConstParameter.
- <li>javassist.FieldInitializer was renamed into
- javassist.CtField.Initializer.
- <li>A bug in javassist.bytecode.Bytecode.addInvokeinterface() has been
- fixed.
- <li>In javassist.bytecode.Bytecode, addGetfield(), addGetstatic(),
- addInvokespecial(), addInvokestatic(), addInvokevirtual(),
- and addInvokeinterface()
- have been modified to update the current statck depth.
- </ul>
-
- <p>- version 2.1 in July, 2002.
- <ul>
- <li>javassist.CtMember and javassist.CtBehavior have been added.
- <li>javassist.CtClass.toBytecode() has been added.
- <li>javassist.CtClass.toClass() and javassist.ClassPool.writeAsClass()
- has been added.
- <li>javassist.ByteArrayClassPath has been added.
- <li>javassist.bytecode.Mnemonic has been added.
- <li>Several bugs have been fixed.
- </ul>
-
- <p>- version 2.0 (major update) in November, 2001.
- <ul>
- <li>The javassist.bytecode package has been provided. It is a
- lower-level API for directly modifying a class file although
- the users must have detailed knowledge of the Java bytecode.
-
- <li>The mechanism for creating CtClass objects have been changed.
-
- <li>javassist.tool.Dump moves to the javassist package.
- </ul>
-
- <p>version 1.0 in July, 2001.
- <ul>
- <li>javassist.reflect.Metaobject and ClassMetaobject was changed.
- Now they throw the same exception that they receive from a
- base-level object.
- </ul>
-
- <p>- version 0.8
- <ul>
- <li>javassist.tool.Dump was added. It is a class file viewer.
-
- <li>javassist.FiledInitializer.byNewArray() was added. It is for
- initializing a field with an array object.
-
- <li>javassist.CodeConverter.redirectMethodCall() was added.
-
- <li>javassist.Run was added.
- </ul>
-
- <p>- version 0.7
- <ul>
- <li>javassit.Loader was largely modified. javassist.UserLoader was
- deleted. Instead, Codebase was renamed to ClassPath
- and UserClassPath was added. Now programmers who want to
- customize Loader must write a class implementing UserClassPath
- instead of UserLoader. This change is for sharing class search paths
- between Loader and CtClass.CtClass(String).
-
- <li>CtClass.addField(), addMethod(), addConstructor(), addWrapper() were
- also largely modified so that it receives CtNewMethod, CtNewConstructor,
- or CtNewField. The static methods for creating these objects were
- added to the API.
-
- <li>Constructors are now represented by CtConstructor objects.
- CtConstructor is a subclass of CtMethod.
-
- <li>CtClass.getUserAttribute() was removed. Use CtClass.getAttribute().
-
- <li>javassist.rmi.RmiLoader was added.
-
- <li>javassist.reflect.Metalevel._setMetaobject() was added. Now
- metaobjects can be replaced at runtime.
- </ul>
-
- <p>- version 0.6
- <ul>
- <li>Javassist was modified to correctly deal with array types appearing
- in signatures.
-
- <li>A bug crashed resulting bytecode if a class includes a private static
- filed. It has been fixed.
-
- <li>javassist.CtNewInterface was added.
-
- <li>javassist.Loader.recordClass() was renamed into makeClass().
-
- <li>javassist.UserLoader.loadClass() was changed to take the second
- parameter.
- </ul>
-
- <p>- version 0.5
- <ul>
- <li>a bug-fix version.
- </ul>
-
- <p>- version 0.4
- <ul>
- <li>Major update again. Many classes and methods were changed.
- Most of methods taking java.lang.Class have been changed to
- take javassist.CtClass.
- </ul>
-
- <p>- version 0.3
- <ul>
- <li>Major update. Many classes and methods were changed.
- </ul>
-
- <p>- version 0.2
- <ul>
- <li>Jar/zip files are supported.
- </ul>
-
- <p>-version 0.1 in April, 1999.
- <ul>
- <li>The first release.
- </ul>
-
- <p><br>
-
- <h2>Bug reports etc.</h2>
-
- <dl>
- <dt>Bug reports:
- <dd><tt><a href="mailto:chiba@acm.org">chiba@acm.org</a></tt>
- <br>or
- <tt><a href="mailto:chiba@is.titech.ac.jp">chiba@is.titech.ac.jp</a></tt>
- <br>
-
- <p><dt>The home page of Javassist:
- <dd>Visit <a href="http://www.jboss.org/index.html?module=html&op=userdisplay&id=developers/projects/javassist"><tt>www.jboss.org</tt></a>
-
- </dl>
-
- <p><br>
-
- <a name="copyright">
- <h2>Copyright notices</h2>
-
- <p>Javassist, a Java-bytecode translator toolkit.
- <br>Copyright (C) 1999-2003 Shigeru Chiba. All Rights Reserved.
-
- <p>The contents of this software, Javassist, are subject to
- the Mozilla Public License Version 1.1 (the "License");<br>
- you may not use this software except in compliance
- with the License. You may obtain a copy of the License at
- <br>http://www.mozilla.org/MPL/
-
- <p>Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF <br>ANY KIND, either express or implied.
- See the License for the specific language governing rights and
- <br>limitations under the License.
-
- <p>The Original Code is Javassist.
-
- <p>The Initial Developer of the Original Code is Shigeru Chiba.
- Portions created by the Initial Developer are<br>
- Copyright (C) 1999-2003 Shigeru Chiba. All Rights Reserved.
- <p>Contributor(s): ______________________________________.
-
- <p>Alternatively, the contents of this software may be used under the
- terms of the GNU Lesser General Public License Version 2.1 or later
- (the "LGPL"), in which case the provisions of the LGPL are applicable
- instead of those above. If you wish to allow use of your version of
- this software only under the terms of the LGPL, and not to allow others to
- use your version of this software under the terms of the MPL, indicate
- your decision by deleting the provisions above and replace them with
- the notice and other provisions required by the LGPL. If you do not
- delete the provisions above, a recipient may use your version of this
- software under the terms of either the MPL or the LGPL.
-
- <p>If you obtain this software as part of JBoss, the contents of this
- software may be used under only the terms of the LGPL. To use them
- under the MPL, you must obtain a separate package including only
- Javassist but not the other part of JBoss.
-
- <p><br>
-
- <h2>Acknowledgments</h2>
-
- <p>The development of this software is sponsored in part by the PRESTO
- programs of <a href="http://www.jst.go.jp/">Japan
- Science and Technology Corporation</a>.
-
- <p>I'd like to thank Michiaki Tatsubori, Johan Cloetens,
- Philip Tomlinson, Alex Villazon, Pascal Rapicault, Dan HE, Eric Tanter,
- Michael Haupt, Toshiyuki Sasaki, Renaud Pawlak, Luc Bourlier,
- Eric Bui, Lewis Stiller, Susumu Yamazaki, Rodrigo Teruo Tomita,
- Marc Segura-Devillechaise, Jan Baudisch, Julien Blass, Yoshiki Sato,
- Fabian Crabus, Bo Norregaard Jorgensen, Bob Lee, Bill Burke,
- Remy Sanlaville, Muga Nishizawa, Alexey Loubyansky, Saori Oki,
- Andreas Salathe, Dante Torres estrada, S. Pam, Nuno Santos,
- Denis Taye, and Colin Sampaleanu
- for their contributions.
-
- <p><br>
-
- <hr>
- <a href="http://www.is.titech.ac.jp/~chiba">Shigeru Chiba</a>
- (Email: <tt>chiba@acm.org</tt>)
- <br>Dept. of Math. and Computing Sciences,
- <a href="http://www.titech.ac.jp">Tokyo Institute of Technology</a>
|