@@ -281,6 +281,13 @@ see javassist.Dump. | |||
<h2>Changes</h2> | |||
<p>-version 3.20 | |||
<ul> | |||
<li>JIRA JASSIST-241 | |||
</ul> | |||
</p> | |||
<p>-version 3.19 on January 6, 2015 | |||
<ul> | |||
<li>JIRA JASSIST-158, 205, 206, 207, 208, 209, 211, 212, 216, 220, 223, 224, |
@@ -31,6 +31,8 @@ import java.util.Hashtable; | |||
import java.util.Iterator; | |||
import java.util.ArrayList; | |||
import java.util.Enumeration; | |||
import javassist.bytecode.ClassFile; | |||
import javassist.bytecode.Descriptor; | |||
/** | |||
@@ -734,6 +736,54 @@ public class ClassPool { | |||
return clazz; | |||
} | |||
/** | |||
* Creates a new class (or interface) from the given class file. | |||
* If there already exists a class with the same name, the new class | |||
* overwrites that previous class. | |||
* | |||
* <p>This method is used for creating a <code>CtClass</code> object | |||
* directly from a class file. The qualified class name is obtained | |||
* from the class file; you do not have to explicitly give the name. | |||
* | |||
* @param classfile class file. | |||
* @throws RuntimeException if there is a frozen class with the | |||
* the same name. | |||
* @since 3.20 | |||
*/ | |||
public CtClass makeClass(ClassFile classfile) | |||
throws RuntimeException | |||
{ | |||
return makeClass(classfile, true); | |||
} | |||
/** | |||
* Creates a new class (or interface) from the given class file. | |||
* If there already exists a class with the same name, the new class | |||
* overwrites that previous class. | |||
* | |||
* <p>This method is used for creating a <code>CtClass</code> object | |||
* directly from a class file. The qualified class name is obtained | |||
* from the class file; you do not have to explicitly give the name. | |||
* | |||
* @param classfile class file. | |||
* @param ifNotFrozen throws a RuntimeException if this parameter is true | |||
* and there is a frozen class with the same name. | |||
* @since 3.20 | |||
*/ | |||
public CtClass makeClass(ClassFile classfile, boolean ifNotFrozen) | |||
throws RuntimeException | |||
{ | |||
compress(); | |||
CtClass clazz = new CtClassType(classfile, this); | |||
clazz.checkModify(); | |||
String classname = clazz.getName(); | |||
if (ifNotFrozen) | |||
checkNotFrozen(classname); | |||
cacheCtClass(classname, clazz, true); | |||
return clazz; | |||
} | |||
/** | |||
* Creates a new class (or interface) from the given class file. | |||
* If there already exists a class with the same name, this method |
@@ -69,7 +69,7 @@ public abstract class CtClass { | |||
/** | |||
* The version number of this release. | |||
*/ | |||
public static final String version = "3.19.0-GA"; | |||
public static final String version = "3.20.0-GA"; | |||
/** | |||
* Prints the version number and the copyright notice. |
@@ -97,6 +97,12 @@ class CtClassType extends CtClass { | |||
qualifiedName = classfile.getName(); | |||
} | |||
CtClassType(ClassFile cf, ClassPool cp) { | |||
this((String)null, cp); | |||
classfile = cf; | |||
qualifiedName = classfile.getName(); | |||
} | |||
protected void extendToString(StringBuffer buffer) { | |||
if (wasChanged) | |||
buffer.append("changed "); |
@@ -23,13 +23,38 @@ import java.util.ArrayList; | |||
import java.util.List; | |||
import java.util.ListIterator; | |||
import java.util.Map; | |||
import javassist.CannotCompileException; | |||
/** | |||
* <code>ClassFile</code> represents a Java <code>.class</code> file, which | |||
* consists of a constant pool, methods, fields, and attributes. | |||
* | |||
* | |||
* <p>For example, | |||
* <blockquote><pre> | |||
* ClassFile cf = new ClassFile(false, "test.Foo", null); | |||
* cf.setInterfaces(new String[] { "java.lang.Cloneable" }); | |||
* | |||
* FieldInfo f = new FieldInfo(cf.getConstPool(), "width", "I"); | |||
* f.setAccessFlags(AccessFlag.PUBLIC); | |||
* cf.addField(f); | |||
* | |||
* cf.write(new DataOutputStream(new FileOutputStream("Foo.class"))); | |||
* </pre></blockquote> | |||
* This code generates a class file <code>Foo.class</code> for the following class: | |||
* <blockquote><pre> | |||
* package test; | |||
* class Foo implements Cloneable { | |||
* public int width; | |||
* } | |||
* </pre></blockquote> | |||
* </p> | |||
* | |||
* @see FieldInfo | |||
* @see MethodInfo | |||
* @see ClassFileWriter | |||
* @see javassist.CtClass#getClassFile() | |||
* @see javassist.ClassPool#makeClass(ClassFile) | |||
*/ | |||
public final class ClassFile { | |||
int major, minor; // version number | |||
@@ -132,7 +157,7 @@ public final class ClassFile { | |||
* @param classname | |||
* a fully-qualified class name | |||
* @param superclass | |||
* a fully-qualified super class name | |||
* a fully-qualified super class name or null. | |||
*/ | |||
public ClassFile(boolean isInterface, String classname, String superclass) { | |||
major = MAJOR_VERSION; |
@@ -94,10 +94,20 @@ public final class ConstPool { | |||
public static final int CONST_Utf8 = Utf8Info.tag; | |||
/** | |||
* <code>Cosnt_MethodHandle</code> | |||
* <code>CONSTANT_MethodHandle</code> | |||
*/ | |||
public static final int CONST_MethodHandle = MethodHandleInfo.tag; | |||
/** | |||
* <code>CONSTANT_MethodHandle</code> | |||
*/ | |||
public static final int CONST_MethodType = MethodTypeInfo.tag; | |||
/** | |||
* <code>CONSTANT_MethodHandle</code> | |||
*/ | |||
public static final int CONST_InvokeDynamic = InvokeDynamicInfo.tag; | |||
/** | |||
* Represents the class using this constant pool table. | |||
*/ |
@@ -25,6 +25,15 @@ import java.util.ArrayList; | |||
/** | |||
* <code>field_info</code> structure. | |||
* | |||
* <p>The following code adds a public field <code>width</code> | |||
* of <code>int</code> type: | |||
* <blockquote><pre> | |||
* ClassFile cf = ... | |||
* FieldInfo f = new FieldInfo(cf.getConstPool(), "width", "I"); | |||
* f.setAccessFlags(AccessFlag.PUBLIC); | |||
* cf.addField(f); | |||
* </pre></blockquote> | |||
* | |||
* @see javassist.CtField#getFieldInfo() | |||
*/ | |||
public final class FieldInfo { |
@@ -22,6 +22,7 @@ import java.io.IOException; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import java.util.Map; | |||
import javassist.ClassPool; | |||
import javassist.bytecode.stackmap.MapMaker; | |||
@@ -30,9 +31,25 @@ import javassist.bytecode.stackmap.MapMaker; | |||
* | |||
* <p>The bytecode sequence of the method is represented | |||
* by a <code>CodeAttribute</code> object. | |||
* | |||
* <p>The following code adds the default constructor to a class: | |||
* of <code>int</code> type: | |||
* <blockquote><pre> | |||
* ClassFile cf = ... | |||
* Bytecode code = new Bytecode(cf.getConstPool()); | |||
* code.addAload(0); | |||
* code.addInvokespecial("java/lang/Object", MethodInfo.nameInit, "()V"); | |||
* code.addReturn(null); | |||
* code.setMaxLocals(1); | |||
* | |||
* MethodInfo minfo = new MethodInfo(cf.getConstPool(), MethodInfo.nameInit, "()V"); | |||
* minfo.setCodeAttribute(code.toCodeAttribute()); | |||
* cf.addMethod(minfo); | |||
* </pre></blockquote> | |||
* | |||
* @see #getCodeAttribute() | |||
* @see CodeAttribute | |||
* @see Bytecode | |||
* @see javassist.CtMethod#getMethodInfo() | |||
* @see javassist.CtConstructor#getMethodInfo() | |||
*/ |