From c43f4a7cde41d04095feb027f33f3ab4da7248bd Mon Sep 17 00:00:00 2001
From: chibash This method is used for creating a This method is used for creating a For example,
+ * 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.
+ *
+ * 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.
- *
+ *
+ *
+ * This code generates a class file
+ * 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")));
+ *
Foo.class
for the following class:
+ *
+ *
+ * package test;
+ * class Foo implements Cloneable {
+ * public int width;
+ * }
+ *
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:
+ *
+ * * @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; * *+ * ClassFile cf = ... + * FieldInfo f = new FieldInfo(cf.getConstPool(), "width", "I"); + * f.setAccessFlags(AccessFlag.PUBLIC); + * cf.addField(f); + *
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:
+ *
* * @see #getCodeAttribute() * @see CodeAttribute + * @see Bytecode * @see javassist.CtMethod#getMethodInfo() * @see javassist.CtConstructor#getMethodInfo() */ -- cgit v1.2.3+ * 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); + *