From c43f4a7cde41d04095feb027f33f3ab4da7248bd Mon Sep 17 00:00:00 2001 From: chibash Date: Wed, 4 Feb 2015 01:20:21 +0900 Subject: updated javadoc comments. makeClass(ClassFile cf) was added to ClassPool. --- src/main/javassist/ClassPool.java | 50 +++++++++++++++++++++++++++++ src/main/javassist/CtClass.java | 2 +- src/main/javassist/CtClassType.java | 6 ++++ src/main/javassist/bytecode/ClassFile.java | 29 +++++++++++++++-- src/main/javassist/bytecode/ConstPool.java | 12 ++++++- src/main/javassist/bytecode/FieldInfo.java | 9 ++++++ src/main/javassist/bytecode/MethodInfo.java | 17 ++++++++++ 7 files changed, 121 insertions(+), 4 deletions(-) (limited to 'src/main') diff --git a/src/main/javassist/ClassPool.java b/src/main/javassist/ClassPool.java index a1e46e2e..c90c2c74 100644 --- a/src/main/javassist/ClassPool.java +++ b/src/main/javassist/ClassPool.java @@ -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. + * + *

This method is used for creating a CtClass 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. + * + *

This method is used for creating a CtClass 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 diff --git a/src/main/javassist/CtClass.java b/src/main/javassist/CtClass.java index 251cd10f..fc828847 100644 --- a/src/main/javassist/CtClass.java +++ b/src/main/javassist/CtClass.java @@ -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. diff --git a/src/main/javassist/CtClassType.java b/src/main/javassist/CtClassType.java index 2f875f65..e86780d3 100644 --- a/src/main/javassist/CtClassType.java +++ b/src/main/javassist/CtClassType.java @@ -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 "); diff --git a/src/main/javassist/bytecode/ClassFile.java b/src/main/javassist/bytecode/ClassFile.java index cc7cae59..f27ff4d8 100644 --- a/src/main/javassist/bytecode/ClassFile.java +++ b/src/main/javassist/bytecode/ClassFile.java @@ -23,13 +23,38 @@ import java.util.ArrayList; import java.util.List; import java.util.ListIterator; import java.util.Map; + import javassist.CannotCompileException; /** * ClassFile represents a Java .class file, which * consists of a constant pool, methods, fields, and attributes. - * + * + *

For example, + *

+ * 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")));
+ * 
+ * This code generates a class file Foo.class for the following class: + *
+ * package test;
+ * class Foo implements Cloneable {
+ *     public int width;
+ * }
+ * 
+ *

+ * + * @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; diff --git a/src/main/javassist/bytecode/ConstPool.java b/src/main/javassist/bytecode/ConstPool.java index f05dfd4f..78935160 100644 --- a/src/main/javassist/bytecode/ConstPool.java +++ b/src/main/javassist/bytecode/ConstPool.java @@ -94,10 +94,20 @@ public final class ConstPool { public static final int CONST_Utf8 = Utf8Info.tag; /** - * Cosnt_MethodHandle + * CONSTANT_MethodHandle */ public static final int CONST_MethodHandle = MethodHandleInfo.tag; + /** + * CONSTANT_MethodHandle + */ + public static final int CONST_MethodType = MethodTypeInfo.tag; + + /** + * CONSTANT_MethodHandle + */ + public static final int CONST_InvokeDynamic = InvokeDynamicInfo.tag; + /** * Represents the class using this constant pool table. */ diff --git a/src/main/javassist/bytecode/FieldInfo.java b/src/main/javassist/bytecode/FieldInfo.java index 485df3dd..cbba0a85 100644 --- a/src/main/javassist/bytecode/FieldInfo.java +++ b/src/main/javassist/bytecode/FieldInfo.java @@ -25,6 +25,15 @@ import java.util.ArrayList; /** * field_info structure. * + *

The following code adds a public field width + * of int type: + *

+ * ClassFile cf = ...
+ * FieldInfo f = new FieldInfo(cf.getConstPool(), "width", "I");
+ * f.setAccessFlags(AccessFlag.PUBLIC);
+ * cf.addField(f);
+ * 
+ * * @see javassist.CtField#getFieldInfo() */ public final class FieldInfo { diff --git a/src/main/javassist/bytecode/MethodInfo.java b/src/main/javassist/bytecode/MethodInfo.java index df436dda..4b8c1c4d 100644 --- a/src/main/javassist/bytecode/MethodInfo.java +++ b/src/main/javassist/bytecode/MethodInfo.java @@ -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; * *

The bytecode sequence of the method is represented * by a CodeAttribute object. + * + *

The following code adds the default constructor to a class: + * of int type: + *

+ * 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);
+ * 
* * @see #getCodeAttribute() * @see CodeAttribute + * @see Bytecode * @see javassist.CtMethod#getMethodInfo() * @see javassist.CtConstructor#getMethodInfo() */ -- cgit v1.2.3