home *** CD-ROM | disk | FTP | other *** search
Wrap
package sun.misc; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.lang.reflect.Method; import java.security.AccessController; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import sun.security.action.GetBooleanAction; public class ProxyGenerator { private static final String superclassName = "java/lang/reflect/Proxy"; private static final String handlerFieldName = "h"; private static final boolean saveGeneratedFiles = (Boolean)AccessController.doPrivileged(new GetBooleanAction("sun.misc.ProxyGenerator.saveGeneratedFiles")); private static Method hashCodeMethod; private static Method equalsMethod; private static Method toStringMethod; private String className; private Class[] interfaces; // $FF: renamed from: cp sun.misc.ProxyGenerator.ConstantPool private ConstantPool field_0 = new ConstantPool((1)null); private List fields = new ArrayList(); private List methods = new ArrayList(); private Map proxyMethods = new HashMap(11); // $FF: synthetic field static Class class$java$lang$Object; // $FF: synthetic field static Class class$java$lang$Error; // $FF: synthetic field static Class class$java$lang$RuntimeException; // $FF: synthetic field static Class class$java$lang$Throwable; public static byte[] generateProxyClass(String var0, Class[] var1) { ProxyGenerator var2 = new ProxyGenerator(var0, var1); byte[] var3 = var2.generateClassFile(); if (saveGeneratedFiles) { AccessController.doPrivileged(new 1(var0, var3)); } return var3; } private ProxyGenerator(String var1, Class[] var2) { this.className = var1; this.interfaces = var2; } private byte[] generateClassFile() { this.addProxyMethod(hashCodeMethod, class$java$lang$Object == null ? (class$java$lang$Object = class$("java.lang.Object")) : class$java$lang$Object); this.addProxyMethod(equalsMethod, class$java$lang$Object == null ? (class$java$lang$Object = class$("java.lang.Object")) : class$java$lang$Object); this.addProxyMethod(toStringMethod, class$java$lang$Object == null ? (class$java$lang$Object = class$("java.lang.Object")) : class$java$lang$Object); for(int var1 = 0; var1 < this.interfaces.length; ++var1) { Method[] var2 = this.interfaces[var1].getMethods(); for(int var3 = 0; var3 < var2.length; ++var3) { this.addProxyMethod(var2[var3], this.interfaces[var1]); } } try { this.methods.add(this.generateConstructor()); for(ProxyMethod var13 : this.proxyMethods.values()) { this.fields.add(new FieldInfo(this, var13.methodFieldName, "Ljava/lang/reflect/Method;", 10)); this.methods.add(sun.misc.ProxyGenerator.ProxyMethod.access$200(var13)); } this.methods.add(this.generateStaticInitializer()); } catch (IOException var10) { throw new InternalError("unexpected I/O Exception"); } this.field_0.getClass(dotToSlash(this.className)); this.field_0.getClass("java/lang/reflect/Proxy"); for(int var12 = 0; var12 < this.interfaces.length; ++var12) { this.field_0.getClass(dotToSlash(this.interfaces[var12].getName())); } this.field_0.setReadOnly(); ByteArrayOutputStream var14 = new ByteArrayOutputStream(); DataOutputStream var4 = new DataOutputStream(var14); try { var4.writeInt(-889275714); var4.writeShort(3); var4.writeShort(45); this.field_0.write(var4); var4.writeShort(49); var4.writeShort(this.field_0.getClass(dotToSlash(this.className))); var4.writeShort(this.field_0.getClass("java/lang/reflect/Proxy")); var4.writeShort(this.interfaces.length); for(int var5 = 0; var5 < this.interfaces.length; ++var5) { var4.writeShort(this.field_0.getClass(dotToSlash(this.interfaces[var5].getName()))); } var4.writeShort(this.fields.size()); for(FieldInfo var7 : this.fields) { var7.write(var4); } var4.writeShort(this.methods.size()); for(MethodInfo var8 : this.methods) { var8.write(var4); } var4.writeShort(0); } catch (IOException var9) { throw new InternalError("unexpected I/O Exception"); } return var14.toByteArray(); } private void addProxyMethod(Method var1, Class var2) { String var3 = var1.getName(); Class[] var4 = var1.getParameterTypes(); Class var5 = var1.getReturnType(); Class[] var6 = var1.getExceptionTypes(); String var7 = var3 + getParameterDescriptors(var4); ProxyMethod var8 = (ProxyMethod)this.proxyMethods.get(var7); if (var8 != null) { if (var5 != var8.returnType) { throw new IllegalArgumentException("methods with same name and parameter signature but different return type in " + var8.fromClass + " and " + var2 + ": " + var7); } ArrayList var9 = new ArrayList(); collectCompatibleTypes(var6, var8.exceptionTypes, var9); collectCompatibleTypes(var8.exceptionTypes, var6, var9); var8.exceptionTypes = new Class[var9.size()]; var8.exceptionTypes = (Class[])var9.toArray(var8.exceptionTypes); } else { var8 = new ProxyMethod(this, var3, var4, var5, var6, var2, "m" + this.proxyMethods.size(), (1)null); this.proxyMethods.put(var7, var8); } } private MethodInfo generateConstructor() throws IOException { MethodInfo var1 = new MethodInfo(this, "<init>", "(Ljava/lang/reflect/InvocationHandler;)V", 1); DataOutputStream var2 = new DataOutputStream(var1.code); this.code_aload(0, var2); this.code_aload(1, var2); var2.writeByte(183); var2.writeShort(this.field_0.getMethodRef("java/lang/reflect/Proxy", "<init>", "(Ljava/lang/reflect/InvocationHandler;)V")); var2.writeByte(177); var1.maxStack = 10; var1.maxLocals = 2; var1.declaredExceptions = new short[0]; return var1; } private MethodInfo generateStaticInitializer() throws IOException { MethodInfo var1 = new MethodInfo(this, "<clinit>", "()V", 8); byte var2 = 1; byte var4 = 0; DataOutputStream var6 = new DataOutputStream(var1.code); for(ProxyMethod var8 : this.proxyMethods.values()) { sun.misc.ProxyGenerator.ProxyMethod.access$1900(var8, var6); } var6.writeByte(177); short var3; short var5 = var3 = (short)var1.code.size(); var1.exceptionTable.add(new ExceptionTableEntry(var4, var5, var3, this.field_0.getClass("java/lang/NoSuchMethodException"))); this.code_astore(var2, var6); var6.writeByte(187); var6.writeShort(this.field_0.getClass("java/lang/NoSuchMethodError")); var6.writeByte(89); this.code_aload(var2, var6); var6.writeByte(182); var6.writeShort(this.field_0.getMethodRef("java/lang/Throwable", "getMessage", "()Ljava/lang/String;")); var6.writeByte(183); var6.writeShort(this.field_0.getMethodRef("java/lang/NoSuchMethodError", "<init>", "(Ljava/lang/String;)V")); var6.writeByte(191); var3 = (short)var1.code.size(); var1.exceptionTable.add(new ExceptionTableEntry(var4, var5, var3, this.field_0.getClass("java/lang/ClassNotFoundException"))); this.code_astore(var2, var6); var6.writeByte(187); var6.writeShort(this.field_0.getClass("java/lang/NoClassDefFoundError")); var6.writeByte(89); this.code_aload(var2, var6); var6.writeByte(182); var6.writeShort(this.field_0.getMethodRef("java/lang/Throwable", "getMessage", "()Ljava/lang/String;")); var6.writeByte(183); var6.writeShort(this.field_0.getMethodRef("java/lang/NoClassDefFoundError", "<init>", "(Ljava/lang/String;)V")); var6.writeByte(191); var1.maxStack = 10; var1.maxLocals = (short)(var2 + 1); var1.declaredExceptions = new short[0]; return var1; } private void code_iload(int var1, DataOutputStream var2) throws IOException { this.codeLocalLoadStore(var1, 21, 26, var2); } private void code_lload(int var1, DataOutputStream var2) throws IOException { this.codeLocalLoadStore(var1, 22, 30, var2); } private void code_fload(int var1, DataOutputStream var2) throws IOException { this.codeLocalLoadStore(var1, 23, 34, var2); } private void code_dload(int var1, DataOutputStream var2) throws IOException { this.codeLocalLoadStore(var1, 24, 38, var2); } private void code_aload(int var1, DataOutputStream var2) throws IOException { this.codeLocalLoadStore(var1, 25, 42, var2); } private void code_istore(int var1, DataOutputStream var2) throws IOException { this.codeLocalLoadStore(var1, 54, 59, var2); } private void code_lstore(int var1, DataOutputStream var2) throws IOException { this.codeLocalLoadStore(var1, 55, 63, var2); } private void code_fstore(int var1, DataOutputStream var2) throws IOException { this.codeLocalLoadStore(var1, 56, 67, var2); } private void code_dstore(int var1, DataOutputStream var2) throws IOException { this.codeLocalLoadStore(var1, 57, 71, var2); } private void code_astore(int var1, DataOutputStream var2) throws IOException { this.codeLocalLoadStore(var1, 58, 75, var2); } private void codeLocalLoadStore(int var1, int var2, int var3, DataOutputStream var4) throws IOException { method_0(var1 >= 0 && var1 <= 65535); if (var1 <= 3) { var4.writeByte(var3 + var1); } else if (var1 <= 255) { var4.writeByte(var2); var4.writeByte(var1 & 255); } else { var4.writeByte(196); var4.writeByte(var2); var4.writeShort(var1 & '\uffff'); } } private void code_ldc(int var1, DataOutputStream var2) throws IOException { method_0(var1 >= 0 && var1 <= 65535); if (var1 <= 255) { var2.writeByte(18); var2.writeByte(var1 & 255); } else { var2.writeByte(19); var2.writeShort(var1 & '\uffff'); } } private void code_ipush(int var1, DataOutputStream var2) throws IOException { if (var1 >= -1 && var1 <= 5) { var2.writeByte(3 + var1); } else if (var1 >= -128 && var1 <= 127) { var2.writeByte(16); var2.writeByte(var1 & 255); } else if (var1 >= -32768 && var1 <= 32767) { var2.writeByte(17); var2.writeShort(var1 & '\uffff'); } else { method_0(false); } } private void codeClassForName(Class var1, DataOutputStream var2) throws IOException { this.code_ldc(this.field_0.getString(var1.getName()), var2); var2.writeByte(184); var2.writeShort(this.field_0.getMethodRef("java/lang/Class", "forName", "(Ljava/lang/String;)Ljava/lang/Class;")); } // $FF: renamed from: assert (boolean) void private static void method_0(boolean var0) { if (!var0) { throw new InternalError("assertion failure"); } } private static String dotToSlash(String var0) { return var0.replace('.', '/'); } private static String getMethodDescriptor(Class[] var0, Class var1) { return getParameterDescriptors(var0) + (var1 == Void.TYPE ? "V" : getFieldType(var1)); } private static String getParameterDescriptors(Class[] var0) { StringBuffer var1 = new StringBuffer("("); for(int var2 = 0; var2 < var0.length; ++var2) { var1.append(getFieldType(var0[var2])); } var1.append(')'); return var1.toString(); } private static String getFieldType(Class var0) { if (var0.isPrimitive()) { return sun.misc.ProxyGenerator.PrimitiveTypeInfo.get(var0).baseTypeString; } else { return var0.isArray() ? var0.getName().replace('.', '/') : "L" + dotToSlash(var0.getName()) + ";"; } } private static int getWordsPerType(Class var0) { return var0 != Long.TYPE && var0 != Double.TYPE ? 1 : 2; } private static void collectCompatibleTypes(Class[] var0, Class[] var1, List var2) { for(int var3 = 0; var3 < var0.length; ++var3) { if (!var2.contains(var0[var3])) { for(int var4 = 0; var4 < var1.length; ++var4) { if (var1[var4].isAssignableFrom(var0[var3])) { var2.add(var0[var3]); break; } } } } } private static List computeUniqueCatchList(Class[] var0) { ArrayList var1 = new ArrayList(); var1.add(class$java$lang$Error == null ? (class$java$lang$Error = class$("java.lang.Error")) : class$java$lang$Error); var1.add(class$java$lang$RuntimeException == null ? (class$java$lang$RuntimeException = class$("java.lang.RuntimeException")) : class$java$lang$RuntimeException); label55: for(int var2 = 0; var2 < var0.length; ++var2) { Class var3 = var0[var2]; if (var3.isAssignableFrom(class$java$lang$Throwable == null ? (class$java$lang$Throwable = class$("java.lang.Throwable")) : class$java$lang$Throwable)) { var1.clear(); break; } if ((class$java$lang$Throwable == null ? (class$java$lang$Throwable = class$("java.lang.Throwable")) : class$java$lang$Throwable).isAssignableFrom(var3)) { int var4 = 0; while(var4 < var1.size()) { Class var5 = (Class)var1.get(var4); if (var5.isAssignableFrom(var3)) { continue label55; } if (var3.isAssignableFrom(var5)) { var1.remove(var4); } else { ++var4; } } var1.add(var3); } } return var1; } // $FF: synthetic method static String access$000(String var0) { return dotToSlash(var0); } // $FF: synthetic method static Class class$(String var0) { try { return Class.forName(var0); } catch (ClassNotFoundException var2) { throw new NoClassDefFoundError(((Throwable)var2).getMessage()); } } // $FF: synthetic method static ConstantPool access$400(ProxyGenerator var0) { return var0.field_0; } // $FF: synthetic method static String access$500(Class[] var0, Class var1) { return getMethodDescriptor(var0, var1); } // $FF: synthetic method static int access$600(Class var0) { return getWordsPerType(var0); } // $FF: synthetic method static void access$700(ProxyGenerator var0, int var1, DataOutputStream var2) throws IOException { var0.code_aload(var1, var2); } // $FF: synthetic method static String access$800(ProxyGenerator var0) { return var0.className; } // $FF: synthetic method static void access$900(ProxyGenerator var0, int var1, DataOutputStream var2) throws IOException { var0.code_ipush(var1, var2); } // $FF: synthetic method static List access$1000(Class[] var0) { return computeUniqueCatchList(var0); } // $FF: synthetic method static void access$1100(ProxyGenerator var0, int var1, DataOutputStream var2) throws IOException { var0.code_astore(var1, var2); } // $FF: synthetic method static void access$1200(ProxyGenerator var0, int var1, DataOutputStream var2) throws IOException { var0.code_iload(var1, var2); } // $FF: synthetic method static void access$1300(ProxyGenerator var0, int var1, DataOutputStream var2) throws IOException { var0.code_lload(var1, var2); } // $FF: synthetic method static void access$1400(ProxyGenerator var0, int var1, DataOutputStream var2) throws IOException { var0.code_fload(var1, var2); } // $FF: synthetic method static void access$1500(ProxyGenerator var0, int var1, DataOutputStream var2) throws IOException { var0.code_dload(var1, var2); } // $FF: synthetic method static void access$1600(boolean var0) { method_0(var0); } // $FF: synthetic method static void access$1700(ProxyGenerator var0, Class var1, DataOutputStream var2) throws IOException { var0.codeClassForName(var1, var2); } // $FF: synthetic method static void access$1800(ProxyGenerator var0, int var1, DataOutputStream var2) throws IOException { var0.code_ldc(var1, var2); } static { try { hashCodeMethod = (class$java$lang$Object == null ? (class$java$lang$Object = class$("java.lang.Object")) : class$java$lang$Object).getMethod("hashCode", (Class[])null); equalsMethod = (class$java$lang$Object == null ? (class$java$lang$Object = class$("java.lang.Object")) : class$java$lang$Object).getMethod("equals", class$java$lang$Object == null ? (class$java$lang$Object = class$("java.lang.Object")) : class$java$lang$Object); toStringMethod = (class$java$lang$Object == null ? (class$java$lang$Object = class$("java.lang.Object")) : class$java$lang$Object).getMethod("toString", (Class[])null); } catch (NoSuchMethodException var1) { throw new NoSuchMethodError(((Throwable)var1).getMessage()); } } }