home *** CD-ROM | disk | FTP | other *** search
/ S283 Planetary Science &… the Search for Life CD 3 / 0_CD-ROM.iso / install / jre1_3 / lib / rt.jar / sun / misc / ProxyGenerator.class (.txt) < prev    next >
Encoding:
Java Class File  |  1979-12-31  |  11.5 KB  |  478 lines

  1. package sun.misc;
  2.  
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.DataOutputStream;
  5. import java.io.IOException;
  6. import java.lang.reflect.Method;
  7. import java.security.AccessController;
  8. import java.util.ArrayList;
  9. import java.util.HashMap;
  10. import java.util.List;
  11. import java.util.Map;
  12. import sun.security.action.GetBooleanAction;
  13.  
  14. public class ProxyGenerator {
  15.    private static final String superclassName = "java/lang/reflect/Proxy";
  16.    private static final String handlerFieldName = "h";
  17.    private static final boolean saveGeneratedFiles = (Boolean)AccessController.doPrivileged(new GetBooleanAction("sun.misc.ProxyGenerator.saveGeneratedFiles"));
  18.    private static Method hashCodeMethod;
  19.    private static Method equalsMethod;
  20.    private static Method toStringMethod;
  21.    private String className;
  22.    private Class[] interfaces;
  23.    // $FF: renamed from: cp sun.misc.ProxyGenerator.ConstantPool
  24.    private ConstantPool field_0 = new ConstantPool((1)null);
  25.    private List fields = new ArrayList();
  26.    private List methods = new ArrayList();
  27.    private Map proxyMethods = new HashMap(11);
  28.    // $FF: synthetic field
  29.    static Class class$java$lang$Object;
  30.    // $FF: synthetic field
  31.    static Class class$java$lang$Error;
  32.    // $FF: synthetic field
  33.    static Class class$java$lang$RuntimeException;
  34.    // $FF: synthetic field
  35.    static Class class$java$lang$Throwable;
  36.  
  37.    public static byte[] generateProxyClass(String var0, Class[] var1) {
  38.       ProxyGenerator var2 = new ProxyGenerator(var0, var1);
  39.       byte[] var3 = var2.generateClassFile();
  40.       if (saveGeneratedFiles) {
  41.          AccessController.doPrivileged(new 1(var0, var3));
  42.       }
  43.  
  44.       return var3;
  45.    }
  46.  
  47.    private ProxyGenerator(String var1, Class[] var2) {
  48.       this.className = var1;
  49.       this.interfaces = var2;
  50.    }
  51.  
  52.    private byte[] generateClassFile() {
  53.       this.addProxyMethod(hashCodeMethod, class$java$lang$Object == null ? (class$java$lang$Object = class$("java.lang.Object")) : class$java$lang$Object);
  54.       this.addProxyMethod(equalsMethod, class$java$lang$Object == null ? (class$java$lang$Object = class$("java.lang.Object")) : class$java$lang$Object);
  55.       this.addProxyMethod(toStringMethod, class$java$lang$Object == null ? (class$java$lang$Object = class$("java.lang.Object")) : class$java$lang$Object);
  56.  
  57.       for(int var1 = 0; var1 < this.interfaces.length; ++var1) {
  58.          Method[] var2 = this.interfaces[var1].getMethods();
  59.  
  60.          for(int var3 = 0; var3 < var2.length; ++var3) {
  61.             this.addProxyMethod(var2[var3], this.interfaces[var1]);
  62.          }
  63.       }
  64.  
  65.       try {
  66.          this.methods.add(this.generateConstructor());
  67.  
  68.          for(ProxyMethod var13 : this.proxyMethods.values()) {
  69.             this.fields.add(new FieldInfo(this, var13.methodFieldName, "Ljava/lang/reflect/Method;", 10));
  70.             this.methods.add(sun.misc.ProxyGenerator.ProxyMethod.access$200(var13));
  71.          }
  72.  
  73.          this.methods.add(this.generateStaticInitializer());
  74.       } catch (IOException var10) {
  75.          throw new InternalError("unexpected I/O Exception");
  76.       }
  77.  
  78.       this.field_0.getClass(dotToSlash(this.className));
  79.       this.field_0.getClass("java/lang/reflect/Proxy");
  80.  
  81.       for(int var12 = 0; var12 < this.interfaces.length; ++var12) {
  82.          this.field_0.getClass(dotToSlash(this.interfaces[var12].getName()));
  83.       }
  84.  
  85.       this.field_0.setReadOnly();
  86.       ByteArrayOutputStream var14 = new ByteArrayOutputStream();
  87.       DataOutputStream var4 = new DataOutputStream(var14);
  88.  
  89.       try {
  90.          var4.writeInt(-889275714);
  91.          var4.writeShort(3);
  92.          var4.writeShort(45);
  93.          this.field_0.write(var4);
  94.          var4.writeShort(49);
  95.          var4.writeShort(this.field_0.getClass(dotToSlash(this.className)));
  96.          var4.writeShort(this.field_0.getClass("java/lang/reflect/Proxy"));
  97.          var4.writeShort(this.interfaces.length);
  98.  
  99.          for(int var5 = 0; var5 < this.interfaces.length; ++var5) {
  100.             var4.writeShort(this.field_0.getClass(dotToSlash(this.interfaces[var5].getName())));
  101.          }
  102.  
  103.          var4.writeShort(this.fields.size());
  104.  
  105.          for(FieldInfo var7 : this.fields) {
  106.             var7.write(var4);
  107.          }
  108.  
  109.          var4.writeShort(this.methods.size());
  110.  
  111.          for(MethodInfo var8 : this.methods) {
  112.             var8.write(var4);
  113.          }
  114.  
  115.          var4.writeShort(0);
  116.       } catch (IOException var9) {
  117.          throw new InternalError("unexpected I/O Exception");
  118.       }
  119.  
  120.       return var14.toByteArray();
  121.    }
  122.  
  123.    private void addProxyMethod(Method var1, Class var2) {
  124.       String var3 = var1.getName();
  125.       Class[] var4 = var1.getParameterTypes();
  126.       Class var5 = var1.getReturnType();
  127.       Class[] var6 = var1.getExceptionTypes();
  128.       String var7 = var3 + getParameterDescriptors(var4);
  129.       ProxyMethod var8 = (ProxyMethod)this.proxyMethods.get(var7);
  130.       if (var8 != null) {
  131.          if (var5 != var8.returnType) {
  132.             throw new IllegalArgumentException("methods with same name and parameter signature but different return type in " + var8.fromClass + " and " + var2 + ": " + var7);
  133.          }
  134.  
  135.          ArrayList var9 = new ArrayList();
  136.          collectCompatibleTypes(var6, var8.exceptionTypes, var9);
  137.          collectCompatibleTypes(var8.exceptionTypes, var6, var9);
  138.          var8.exceptionTypes = new Class[var9.size()];
  139.          var8.exceptionTypes = (Class[])var9.toArray(var8.exceptionTypes);
  140.       } else {
  141.          var8 = new ProxyMethod(this, var3, var4, var5, var6, var2, "m" + this.proxyMethods.size(), (1)null);
  142.          this.proxyMethods.put(var7, var8);
  143.       }
  144.  
  145.    }
  146.  
  147.    private MethodInfo generateConstructor() throws IOException {
  148.       MethodInfo var1 = new MethodInfo(this, "<init>", "(Ljava/lang/reflect/InvocationHandler;)V", 1);
  149.       DataOutputStream var2 = new DataOutputStream(var1.code);
  150.       this.code_aload(0, var2);
  151.       this.code_aload(1, var2);
  152.       var2.writeByte(183);
  153.       var2.writeShort(this.field_0.getMethodRef("java/lang/reflect/Proxy", "<init>", "(Ljava/lang/reflect/InvocationHandler;)V"));
  154.       var2.writeByte(177);
  155.       var1.maxStack = 10;
  156.       var1.maxLocals = 2;
  157.       var1.declaredExceptions = new short[0];
  158.       return var1;
  159.    }
  160.  
  161.    private MethodInfo generateStaticInitializer() throws IOException {
  162.       MethodInfo var1 = new MethodInfo(this, "<clinit>", "()V", 8);
  163.       byte var2 = 1;
  164.       byte var4 = 0;
  165.       DataOutputStream var6 = new DataOutputStream(var1.code);
  166.  
  167.       for(ProxyMethod var8 : this.proxyMethods.values()) {
  168.          sun.misc.ProxyGenerator.ProxyMethod.access$1900(var8, var6);
  169.       }
  170.  
  171.       var6.writeByte(177);
  172.       short var3;
  173.       short var5 = var3 = (short)var1.code.size();
  174.       var1.exceptionTable.add(new ExceptionTableEntry(var4, var5, var3, this.field_0.getClass("java/lang/NoSuchMethodException")));
  175.       this.code_astore(var2, var6);
  176.       var6.writeByte(187);
  177.       var6.writeShort(this.field_0.getClass("java/lang/NoSuchMethodError"));
  178.       var6.writeByte(89);
  179.       this.code_aload(var2, var6);
  180.       var6.writeByte(182);
  181.       var6.writeShort(this.field_0.getMethodRef("java/lang/Throwable", "getMessage", "()Ljava/lang/String;"));
  182.       var6.writeByte(183);
  183.       var6.writeShort(this.field_0.getMethodRef("java/lang/NoSuchMethodError", "<init>", "(Ljava/lang/String;)V"));
  184.       var6.writeByte(191);
  185.       var3 = (short)var1.code.size();
  186.       var1.exceptionTable.add(new ExceptionTableEntry(var4, var5, var3, this.field_0.getClass("java/lang/ClassNotFoundException")));
  187.       this.code_astore(var2, var6);
  188.       var6.writeByte(187);
  189.       var6.writeShort(this.field_0.getClass("java/lang/NoClassDefFoundError"));
  190.       var6.writeByte(89);
  191.       this.code_aload(var2, var6);
  192.       var6.writeByte(182);
  193.       var6.writeShort(this.field_0.getMethodRef("java/lang/Throwable", "getMessage", "()Ljava/lang/String;"));
  194.       var6.writeByte(183);
  195.       var6.writeShort(this.field_0.getMethodRef("java/lang/NoClassDefFoundError", "<init>", "(Ljava/lang/String;)V"));
  196.       var6.writeByte(191);
  197.       var1.maxStack = 10;
  198.       var1.maxLocals = (short)(var2 + 1);
  199.       var1.declaredExceptions = new short[0];
  200.       return var1;
  201.    }
  202.  
  203.    private void code_iload(int var1, DataOutputStream var2) throws IOException {
  204.       this.codeLocalLoadStore(var1, 21, 26, var2);
  205.    }
  206.  
  207.    private void code_lload(int var1, DataOutputStream var2) throws IOException {
  208.       this.codeLocalLoadStore(var1, 22, 30, var2);
  209.    }
  210.  
  211.    private void code_fload(int var1, DataOutputStream var2) throws IOException {
  212.       this.codeLocalLoadStore(var1, 23, 34, var2);
  213.    }
  214.  
  215.    private void code_dload(int var1, DataOutputStream var2) throws IOException {
  216.       this.codeLocalLoadStore(var1, 24, 38, var2);
  217.    }
  218.  
  219.    private void code_aload(int var1, DataOutputStream var2) throws IOException {
  220.       this.codeLocalLoadStore(var1, 25, 42, var2);
  221.    }
  222.  
  223.    private void code_istore(int var1, DataOutputStream var2) throws IOException {
  224.       this.codeLocalLoadStore(var1, 54, 59, var2);
  225.    }
  226.  
  227.    private void code_lstore(int var1, DataOutputStream var2) throws IOException {
  228.       this.codeLocalLoadStore(var1, 55, 63, var2);
  229.    }
  230.  
  231.    private void code_fstore(int var1, DataOutputStream var2) throws IOException {
  232.       this.codeLocalLoadStore(var1, 56, 67, var2);
  233.    }
  234.  
  235.    private void code_dstore(int var1, DataOutputStream var2) throws IOException {
  236.       this.codeLocalLoadStore(var1, 57, 71, var2);
  237.    }
  238.  
  239.    private void code_astore(int var1, DataOutputStream var2) throws IOException {
  240.       this.codeLocalLoadStore(var1, 58, 75, var2);
  241.    }
  242.  
  243.    private void codeLocalLoadStore(int var1, int var2, int var3, DataOutputStream var4) throws IOException {
  244.       method_0(var1 >= 0 && var1 <= 65535);
  245.       if (var1 <= 3) {
  246.          var4.writeByte(var3 + var1);
  247.       } else if (var1 <= 255) {
  248.          var4.writeByte(var2);
  249.          var4.writeByte(var1 & 255);
  250.       } else {
  251.          var4.writeByte(196);
  252.          var4.writeByte(var2);
  253.          var4.writeShort(var1 & '\uffff');
  254.       }
  255.  
  256.    }
  257.  
  258.    private void code_ldc(int var1, DataOutputStream var2) throws IOException {
  259.       method_0(var1 >= 0 && var1 <= 65535);
  260.       if (var1 <= 255) {
  261.          var2.writeByte(18);
  262.          var2.writeByte(var1 & 255);
  263.       } else {
  264.          var2.writeByte(19);
  265.          var2.writeShort(var1 & '\uffff');
  266.       }
  267.  
  268.    }
  269.  
  270.    private void code_ipush(int var1, DataOutputStream var2) throws IOException {
  271.       if (var1 >= -1 && var1 <= 5) {
  272.          var2.writeByte(3 + var1);
  273.       } else if (var1 >= -128 && var1 <= 127) {
  274.          var2.writeByte(16);
  275.          var2.writeByte(var1 & 255);
  276.       } else if (var1 >= -32768 && var1 <= 32767) {
  277.          var2.writeByte(17);
  278.          var2.writeShort(var1 & '\uffff');
  279.       } else {
  280.          method_0(false);
  281.       }
  282.  
  283.    }
  284.  
  285.    private void codeClassForName(Class var1, DataOutputStream var2) throws IOException {
  286.       this.code_ldc(this.field_0.getString(var1.getName()), var2);
  287.       var2.writeByte(184);
  288.       var2.writeShort(this.field_0.getMethodRef("java/lang/Class", "forName", "(Ljava/lang/String;)Ljava/lang/Class;"));
  289.    }
  290.  
  291.    // $FF: renamed from: assert (boolean) void
  292.    private static void method_0(boolean var0) {
  293.       if (!var0) {
  294.          throw new InternalError("assertion failure");
  295.       }
  296.    }
  297.  
  298.    private static String dotToSlash(String var0) {
  299.       return var0.replace('.', '/');
  300.    }
  301.  
  302.    private static String getMethodDescriptor(Class[] var0, Class var1) {
  303.       return getParameterDescriptors(var0) + (var1 == Void.TYPE ? "V" : getFieldType(var1));
  304.    }
  305.  
  306.    private static String getParameterDescriptors(Class[] var0) {
  307.       StringBuffer var1 = new StringBuffer("(");
  308.  
  309.       for(int var2 = 0; var2 < var0.length; ++var2) {
  310.          var1.append(getFieldType(var0[var2]));
  311.       }
  312.  
  313.       var1.append(')');
  314.       return var1.toString();
  315.    }
  316.  
  317.    private static String getFieldType(Class var0) {
  318.       if (var0.isPrimitive()) {
  319.          return sun.misc.ProxyGenerator.PrimitiveTypeInfo.get(var0).baseTypeString;
  320.       } else {
  321.          return var0.isArray() ? var0.getName().replace('.', '/') : "L" + dotToSlash(var0.getName()) + ";";
  322.       }
  323.    }
  324.  
  325.    private static int getWordsPerType(Class var0) {
  326.       return var0 != Long.TYPE && var0 != Double.TYPE ? 1 : 2;
  327.    }
  328.  
  329.    private static void collectCompatibleTypes(Class[] var0, Class[] var1, List var2) {
  330.       for(int var3 = 0; var3 < var0.length; ++var3) {
  331.          if (!var2.contains(var0[var3])) {
  332.             for(int var4 = 0; var4 < var1.length; ++var4) {
  333.                if (var1[var4].isAssignableFrom(var0[var3])) {
  334.                   var2.add(var0[var3]);
  335.                   break;
  336.                }
  337.             }
  338.          }
  339.       }
  340.  
  341.    }
  342.  
  343.    private static List computeUniqueCatchList(Class[] var0) {
  344.       ArrayList var1 = new ArrayList();
  345.       var1.add(class$java$lang$Error == null ? (class$java$lang$Error = class$("java.lang.Error")) : class$java$lang$Error);
  346.       var1.add(class$java$lang$RuntimeException == null ? (class$java$lang$RuntimeException = class$("java.lang.RuntimeException")) : class$java$lang$RuntimeException);
  347.  
  348.       label55:
  349.       for(int var2 = 0; var2 < var0.length; ++var2) {
  350.          Class var3 = var0[var2];
  351.          if (var3.isAssignableFrom(class$java$lang$Throwable == null ? (class$java$lang$Throwable = class$("java.lang.Throwable")) : class$java$lang$Throwable)) {
  352.             var1.clear();
  353.             break;
  354.          }
  355.  
  356.          if ((class$java$lang$Throwable == null ? (class$java$lang$Throwable = class$("java.lang.Throwable")) : class$java$lang$Throwable).isAssignableFrom(var3)) {
  357.             int var4 = 0;
  358.  
  359.             while(var4 < var1.size()) {
  360.                Class var5 = (Class)var1.get(var4);
  361.                if (var5.isAssignableFrom(var3)) {
  362.                   continue label55;
  363.                }
  364.  
  365.                if (var3.isAssignableFrom(var5)) {
  366.                   var1.remove(var4);
  367.                } else {
  368.                   ++var4;
  369.                }
  370.             }
  371.  
  372.             var1.add(var3);
  373.          }
  374.       }
  375.  
  376.       return var1;
  377.    }
  378.  
  379.    // $FF: synthetic method
  380.    static String access$000(String var0) {
  381.       return dotToSlash(var0);
  382.    }
  383.  
  384.    // $FF: synthetic method
  385.    static Class class$(String var0) {
  386.       try {
  387.          return Class.forName(var0);
  388.       } catch (ClassNotFoundException var2) {
  389.          throw new NoClassDefFoundError(((Throwable)var2).getMessage());
  390.       }
  391.    }
  392.  
  393.    // $FF: synthetic method
  394.    static ConstantPool access$400(ProxyGenerator var0) {
  395.       return var0.field_0;
  396.    }
  397.  
  398.    // $FF: synthetic method
  399.    static String access$500(Class[] var0, Class var1) {
  400.       return getMethodDescriptor(var0, var1);
  401.    }
  402.  
  403.    // $FF: synthetic method
  404.    static int access$600(Class var0) {
  405.       return getWordsPerType(var0);
  406.    }
  407.  
  408.    // $FF: synthetic method
  409.    static void access$700(ProxyGenerator var0, int var1, DataOutputStream var2) throws IOException {
  410.       var0.code_aload(var1, var2);
  411.    }
  412.  
  413.    // $FF: synthetic method
  414.    static String access$800(ProxyGenerator var0) {
  415.       return var0.className;
  416.    }
  417.  
  418.    // $FF: synthetic method
  419.    static void access$900(ProxyGenerator var0, int var1, DataOutputStream var2) throws IOException {
  420.       var0.code_ipush(var1, var2);
  421.    }
  422.  
  423.    // $FF: synthetic method
  424.    static List access$1000(Class[] var0) {
  425.       return computeUniqueCatchList(var0);
  426.    }
  427.  
  428.    // $FF: synthetic method
  429.    static void access$1100(ProxyGenerator var0, int var1, DataOutputStream var2) throws IOException {
  430.       var0.code_astore(var1, var2);
  431.    }
  432.  
  433.    // $FF: synthetic method
  434.    static void access$1200(ProxyGenerator var0, int var1, DataOutputStream var2) throws IOException {
  435.       var0.code_iload(var1, var2);
  436.    }
  437.  
  438.    // $FF: synthetic method
  439.    static void access$1300(ProxyGenerator var0, int var1, DataOutputStream var2) throws IOException {
  440.       var0.code_lload(var1, var2);
  441.    }
  442.  
  443.    // $FF: synthetic method
  444.    static void access$1400(ProxyGenerator var0, int var1, DataOutputStream var2) throws IOException {
  445.       var0.code_fload(var1, var2);
  446.    }
  447.  
  448.    // $FF: synthetic method
  449.    static void access$1500(ProxyGenerator var0, int var1, DataOutputStream var2) throws IOException {
  450.       var0.code_dload(var1, var2);
  451.    }
  452.  
  453.    // $FF: synthetic method
  454.    static void access$1600(boolean var0) {
  455.       method_0(var0);
  456.    }
  457.  
  458.    // $FF: synthetic method
  459.    static void access$1700(ProxyGenerator var0, Class var1, DataOutputStream var2) throws IOException {
  460.       var0.codeClassForName(var1, var2);
  461.    }
  462.  
  463.    // $FF: synthetic method
  464.    static void access$1800(ProxyGenerator var0, int var1, DataOutputStream var2) throws IOException {
  465.       var0.code_ldc(var1, var2);
  466.    }
  467.  
  468.    static {
  469.       try {
  470.          hashCodeMethod = (class$java$lang$Object == null ? (class$java$lang$Object = class$("java.lang.Object")) : class$java$lang$Object).getMethod("hashCode", (Class[])null);
  471.          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);
  472.          toStringMethod = (class$java$lang$Object == null ? (class$java$lang$Object = class$("java.lang.Object")) : class$java$lang$Object).getMethod("toString", (Class[])null);
  473.       } catch (NoSuchMethodException var1) {
  474.          throw new NoSuchMethodError(((Throwable)var1).getMessage());
  475.       }
  476.    }
  477. }
  478.