home *** CD-ROM | disk | FTP | other *** search
- package sunw.demo.classfile;
-
- import java.io.IOException;
- import java.io.OutputStream;
- import java.lang.reflect.Method;
- import sun.beans.ole.event.EncapsulatedEventAdaptorGenerator;
-
- public final class EncapsulatedEventAdaptorClassFile {
- private static String superClassName = "sun.beans.ole.event.EncapsulatedEventAdaptor";
- private String listenerName;
- private Class listenerClass;
- private String adaptorName;
- private ClassFile classFile;
- private Method[] listenerMethods;
- private StringConstant listenerNameConst;
- private FieldConstant methodsField;
- private FieldConstant clazzField;
- private MethodConstant fireMethod;
- private MethodConstant crackedFireMethod;
- private MethodConstant forNameMethod;
- private MethodConstant getMethodsMethod;
- // $FF: synthetic field
- static Class class$java$util$EventObject;
-
- public EncapsulatedEventAdaptorClassFile(String var1, OutputStream var2) throws IOException, ClassNotFoundException {
- this.adaptorName = var1;
- this.listenerName = EncapsulatedEventAdaptorGenerator.getBaseNameFromAdaptorName(var1);
- this.listenerClass = Class.forName(this.listenerName);
- this.listenerMethods = this.listenerClass.getMethods();
- this.classFile = new ClassFile(var1, superClassName);
- this.generateClassSundries();
- this.generateInitializer();
- this.generateConstructor();
- this.generateListenerMethods();
- this.write(var2);
- }
-
- public EncapsulatedEventAdaptorClassFile(String var1, Class var2, OutputStream var3) throws IOException, ClassNotFoundException {
- this.adaptorName = var1;
- this.listenerName = var2.getName();
- this.listenerClass = var2;
- this.listenerMethods = var2.getMethods();
- this.classFile = new ClassFile(var1, superClassName);
- this.generateClassSundries();
- this.generateInitializer();
- this.generateConstructor();
- this.generateListenerMethods();
- this.write(var3);
- }
-
- // $FF: synthetic method
- static Class class$(String var0) {
- try {
- return Class.forName(var0);
- } catch (ClassNotFoundException var2) {
- throw new NoClassDefFoundError(((Throwable)var2).getMessage());
- }
- }
-
- private boolean debug() {
- return false;
- }
-
- private void generateClassSundries() {
- this.classFile.addInterface(ClassFile.fullyQualifiedForm(this.listenerName));
- this.listenerNameConst = this.classFile.addStringConstant(this.listenerName);
- this.classFile.addFieldDesc(new FieldDesc("methods", "[Ljava/lang/reflect/Method;", (short)10, this.classFile, (Attribute[])null));
- this.methodsField = this.classFile.addFieldConstant(this.adaptorName, "methods", "[Ljava/lang/reflect/Method;");
- this.getMethodsMethod = this.classFile.addMethodConstant("java/lang/Class", "getMethods", "()[Ljava/lang/reflect/Method;");
- this.forNameMethod = this.classFile.addMethodConstant("java/lang/Class", "forName", "(Ljava/lang/String;)Ljava/lang/Class;");
- this.classFile.addFieldDesc(new FieldDesc("clazz", "Ljava/lang/Class;", (short)10, this.classFile, (Attribute[])null));
- this.clazzField = this.classFile.addFieldConstant(this.adaptorName, "clazz", "Ljava/lang/Class;");
- this.fireMethod = this.classFile.addMethodConstant(this.adaptorName, "fire", "(Ljava/util/EventObject;Ljava/lang/reflect/Method;)V");
- this.crackedFireMethod = this.classFile.addMethodConstant(this.adaptorName, "fire", "([Ljava/lang/Object;Ljava/lang/reflect/Method;)V");
- Code var1 = new Code(this.classFile, (short)1, (short)2);
- var1.addOpShort((byte)-78, this.clazzField.getConstantPoolIndex());
- var1.addOp((byte)-80);
- Code[] var2 = new Code[]{var1};
- this.classFile.addMethodDesc(new MethodDesc("getListenerClass", "()Ljava/lang/Class;", (short)1, this.classFile, var2));
- }
-
- private void generateConstructor() {
- Code var1 = new Code(this.classFile, (short)1, (short)2);
- Code[] var2 = new Code[]{var1};
- MethodConstant var3 = this.classFile.addMethodConstant(ClassFile.fullyQualifiedForm(superClassName), "<init>", "()V");
- var1.addOp((byte)42);
- var1.addOpShort((byte)-73, ((ConstantPoolEntry)var3).getConstantPoolIndex());
- var1.addOp((byte)-79);
- this.classFile.addMethodDesc(new MethodDesc("<init>", "()V", (short)1, this.classFile, var2));
- }
-
- private void generateCrackedListenerMethodStub(Method var1, Class[] var2, Class[] var3, int var4) {
- Code var5 = new Code(this.classFile, (short)(var2.length * 2 + 1), (short)9);
- String var7 = "";
- var5.addOp((byte)42);
- if (var2.length <= 255) {
- var5.addOp1((byte)16, (byte)var2.length);
- } else {
- short var9 = this.classFile.addIntegerConstant(var2.length).getConstantPoolIndex();
- if (var9 <= 255) {
- var5.addOp1((byte)18, (byte)var9);
- } else {
- var5.addOpShort((byte)19, var9);
- }
- }
-
- var5.addOpShort((byte)-67, this.classFile.addClassConstant("java.lang.Object").getConstantPoolIndex());
- int var12 = 1;
-
- boolean var8;
- for(int var10 = 0; var10 < var2.length; var12 += var8 ? 2 : 1) {
- var5.addOp((byte)89);
- if (var12 <= 255) {
- var5.addOp1((byte)16, (byte)var10);
- } else {
- short var11 = this.classFile.addIntegerConstant(var10).getConstantPoolIndex();
- if (var11 < 255) {
- var5.addOp1((byte)18, (byte)var11);
- } else {
- var5.addOpShort((byte)19, var11);
- }
- }
-
- String var13 = this.processParam(var5, var2[var10], var12);
- var5.addOp((byte)83);
- var8 = var13.equals("J") || var13.equals("D");
- var7 = var7 + var13;
- ++var10;
- }
-
- var5.addOpShort((byte)-78, this.methodsField.getConstantPoolIndex());
- if (var4 <= 255) {
- var5.addOp1((byte)16, (byte)var4);
- } else {
- short var14 = this.classFile.addIntegerConstant(var4).getConstantPoolIndex();
- if (var14 <= 255) {
- var5.addOp1((byte)18, (byte)var14);
- } else {
- var5.addOpShort((byte)19, var14);
- }
- }
-
- var5.addOp((byte)50);
- var5.addOpShort((byte)-74, this.crackedFireMethod.getConstantPoolIndex());
- var5.addOp((byte)-79);
- Attribute[] var6;
- if (var3 != null && var3.length > 0) {
- var6 = new Attribute[]{null, new Exceptions(var3, this.classFile)};
- } else {
- var6 = new Attribute[1];
- }
-
- var6[0] = var5;
- this.classFile.addMethodDesc(new MethodDesc(var1.getName(), "(" + var7 + ")V", (short)(var1.getModifiers() & -1025), this.classFile, var6));
- }
-
- private void generateInitializer() {
- Code var1 = new Code(this.classFile, (short)0, (short)3);
- Code[] var2 = new Code[]{var1};
- short var3 = this.listenerNameConst.getConstantPoolIndex();
- if (var3 <= 255) {
- var1.addOp1((byte)18, (byte)var3);
- } else {
- var1.addOpShort((byte)19, var3);
- }
-
- var1.addOpShort((byte)-72, this.forNameMethod.getConstantPoolIndex());
- var1.addOp((byte)89);
- var1.addOpShort((byte)-77, this.clazzField.getConstantPoolIndex());
- var1.addOpShort((byte)-74, this.getMethodsMethod.getConstantPoolIndex());
- var1.addOpShort((byte)-77, this.methodsField.getConstantPoolIndex());
- var1.addOp((byte)-79);
- this.classFile.addMethodDesc(new MethodDesc("<clinit>", "()V", (short)10, this.classFile, var2));
- }
-
- private void generateListenerMethods() {
- for(int var1 = 0; var1 < this.listenerMethods.length; ++var1) {
- if (!Void.TYPE.equals(this.listenerMethods[var1].getReturnType())) {
- System.err.println("Detected unexpected method signature: " + this.listenerMethods[var1] + " in interface: " + this.listenerName);
- } else {
- Class[] var2 = this.listenerMethods[var1].getParameterTypes();
- Class[] var3 = this.listenerMethods[var1].getExceptionTypes();
- if (var2 != null && var2.length == 1 && (class$java$util$EventObject != null ? class$java$util$EventObject : (class$java$util$EventObject = class$("java.util.EventObject"))).isAssignableFrom(var2[0])) {
- this.generateSimpleListenerMethodStub(this.listenerMethods[var1], var2[0], var3, var1);
- } else {
- this.generateCrackedListenerMethodStub(this.listenerMethods[var1], var2, var3, var1);
- }
- }
- }
-
- }
-
- private void generateSimpleListenerMethodStub(Method var1, Class var2, Class[] var3, int var4) {
- Code var5 = new Code(this.classFile, (short)2, (short)4);
- var5.addOp((byte)42);
- var5.addOp((byte)43);
- var5.addOpShort((byte)-78, this.methodsField.getConstantPoolIndex());
- if (var4 <= 255) {
- var5.addOp1((byte)16, (byte)var4);
- } else {
- short var7 = this.classFile.addIntegerConstant(var4).getConstantPoolIndex();
- if (var7 <= 255) {
- var5.addOp1((byte)18, (byte)var7);
- } else {
- var5.addOpShort((byte)19, var7);
- }
- }
-
- var5.addOp((byte)50);
- var5.addOpShort((byte)-74, this.fireMethod.getConstantPoolIndex());
- var5.addOp((byte)-79);
- Attribute[] var6;
- if (var3 != null && var3.length > 0) {
- var6 = new Attribute[]{null, new Exceptions(var3, this.classFile)};
- } else {
- var6 = new Attribute[1];
- }
-
- var6[0] = var5;
- this.classFile.addMethodDesc(new MethodDesc(var1.getName(), "(" + ClassFile.fieldType(var2.getName()) + ")V", (short)(var1.getModifiers() & -1025), this.classFile, var6));
- }
-
- private String processParam(Code var1, Class var2, int var3) {
- ClassConstant var4 = null;
- MethodConstant var5 = null;
- byte var6 = 25;
- byte var7 = 0;
- boolean var8 = true;
- Class var9 = var2;
-
- String var12;
- for(var12 = ""; var9.isArray(); var12 = var12 + "[") {
- var9 = var9.getComponentType();
- }
-
- boolean var10 = var9.isPrimitive();
- boolean var11 = var2.isArray();
- if (var10) {
- if (var9.equals(Long.TYPE)) {
- var12 = var12 + "J";
- if (!var11) {
- var4 = this.classFile.addClassConstant("java/lang/Long");
- var5 = this.classFile.addMethodConstant("java/lang/Long", "<init>", "(J)V");
- var6 = 22;
- var8 = false;
- }
- } else if (var9.equals(Float.TYPE)) {
- var12 = var12 + "F";
- if (!var11) {
- var4 = this.classFile.addClassConstant("java/lang/Float");
- var5 = this.classFile.addMethodConstant("java/lang/Float", "<init>", "(F)V");
- var6 = 23;
- }
- } else if (var9.equals(Double.TYPE)) {
- var12 = var12 + "D";
- if (!var11) {
- var4 = this.classFile.addClassConstant("java/lang/Double");
- var5 = this.classFile.addMethodConstant("java/lang/Double", "<init>", "(D)V");
- var6 = 24;
- var8 = false;
- }
- } else {
- var6 = 21;
- if (var9.equals(Boolean.TYPE)) {
- var12 = var12 + "Z";
- if (!var11) {
- var4 = this.classFile.addClassConstant("java/lang/Boolean");
- var5 = this.classFile.addMethodConstant("java/lang/Boolean", "<init>", "(Z)V");
- var7 = -111;
- }
- } else if (var9.equals(Character.TYPE)) {
- var12 = var12 + "C";
- if (!var11) {
- var4 = this.classFile.addClassConstant("java/lang/Character");
- var5 = this.classFile.addMethodConstant("java/lang/Character", "<init>", "(C)V");
- var7 = -110;
- }
- } else if (var9.equals(Byte.TYPE)) {
- var12 = var12 + "B";
- if (!var11) {
- var4 = this.classFile.addClassConstant("java/lang/Byte");
- var5 = this.classFile.addMethodConstant("java/lang/Character", "<init>", "(C)V");
- var7 = -111;
- }
- } else if (var9.equals(Short.TYPE)) {
- var12 = var12 + "S";
- if (!var11) {
- var4 = this.classFile.addClassConstant("java/lang/Short");
- var5 = this.classFile.addMethodConstant("java/lang/Short", "<init>", "(S)V");
- var7 = -109;
- }
- } else if (var9.equals(Integer.TYPE)) {
- var12 = var12 + "I";
- if (!var11) {
- var4 = this.classFile.addClassConstant("java/lang/Integer");
- var5 = this.classFile.addMethodConstant("java/lang/Integer", "<init>", "(I)V");
- }
- }
- }
- } else {
- var12 = var12 + ClassFile.fieldType(var9.getName());
- }
-
- if (var3 < 255) {
- var1.addOp1(var6, (byte)var3);
- } else {
- var1.addOp((byte)-60);
- var1.addOpShort(var6, (short)var3);
- }
-
- if (var10 && !var11) {
- if (var7 != 0) {
- var1.addOp(var7);
- }
-
- var1.addOpShort((byte)-69, ((ConstantPoolEntry)var4).getConstantPoolIndex());
- if (var8) {
- var1.addOp((byte)90);
- var1.addOp((byte)95);
- } else {
- var1.addOp((byte)91);
- var1.addOp((byte)91);
- var1.addOp((byte)87);
- }
-
- var1.addOpShort((byte)-73, ((ConstantPoolEntry)var5).getConstantPoolIndex());
- }
-
- return var12;
- }
-
- private void write(OutputStream var1) throws IOException {
- this.classFile.write(var1);
- }
- }
-