home *** CD-ROM | disk | FTP | other *** search
/ S283 Planetary Science &n…he Search for Life DVD 2 / DVD-ROM.iso / install / jre1_3 / lib / rt.jar / java / lang / reflect / Proxy.class (.txt) < prev    next >
Encoding:
Java Class File  |  1979-12-31  |  4.6 KB  |  199 lines

  1. package java.lang.reflect;
  2.  
  3. import java.io.Serializable;
  4. import java.lang.ref.Reference;
  5. import java.lang.ref.WeakReference;
  6. import java.util.Collections;
  7. import java.util.HashMap;
  8. import java.util.Map;
  9. import java.util.WeakHashMap;
  10. import sun.misc.ProxyGenerator;
  11.  
  12. public class Proxy implements Serializable {
  13.    private static final String proxyClassNamePrefix = "$Proxy";
  14.    private static final Class[] constructorParams;
  15.    private static Map loaderToCache;
  16.    private static Object pendingGenerationMarker;
  17.    private static long nextUniqueNumber;
  18.    private static Object nextUniqueNumberLock;
  19.    private static Map proxyClasses;
  20.    // $FF: renamed from: h java.lang.reflect.InvocationHandler
  21.    protected InvocationHandler field_0;
  22.    // $FF: synthetic field
  23.    static Class class$java$lang$reflect$InvocationHandler;
  24.  
  25.    private Proxy() {
  26.    }
  27.  
  28.    protected Proxy(InvocationHandler var1) {
  29.       this.field_0 = var1;
  30.    }
  31.  
  32.    public static Class getProxyClass(ClassLoader var0, Class[] var1) throws IllegalArgumentException {
  33.       Class var2 = null;
  34.       StringBuffer var3 = new StringBuffer();
  35.  
  36.       for(int var4 = 0; var4 < var1.length; ++var4) {
  37.          Class var5 = null;
  38.  
  39.          try {
  40.             var5 = Class.forName(var1[var4].getName(), false, var0);
  41.          } catch (ClassNotFoundException var35) {
  42.          }
  43.  
  44.          if (var5 != var1[var4]) {
  45.             throw new IllegalArgumentException(var1[var4] + " is not visible from class loader");
  46.          }
  47.  
  48.          if (!var5.isInterface()) {
  49.             throw new IllegalArgumentException(var5.getName() + " is not an interface");
  50.          }
  51.  
  52.          var3.append(var1[var4].getName()).append(';');
  53.       }
  54.  
  55.       String var39 = var3.toString();
  56.       Map var7 = loaderToCache;
  57.       Object var6;
  58.       synchronized(var7) {
  59.          var6 = (Map)loaderToCache.get(var0);
  60.          if (var6 == null) {
  61.             var6 = new HashMap(3);
  62.             loaderToCache.put(var0, var6);
  63.          }
  64.       }
  65.  
  66.       synchronized(var6) {
  67.          while(true) {
  68.             Object var9 = ((Map)var6).get(var39);
  69.             if (var9 instanceof Reference) {
  70.                var2 = (Class)((Reference)var9).get();
  71.             }
  72.  
  73.             if (var2 != null) {
  74.                return var2;
  75.             }
  76.  
  77.             if (var9 != pendingGenerationMarker) {
  78.                ((Map)var6).put(var39, pendingGenerationMarker);
  79.                break;
  80.             }
  81.  
  82.             try {
  83.                var6.wait();
  84.             } catch (InterruptedException var34) {
  85.             }
  86.          }
  87.       }
  88.  
  89.       try {
  90.          String var40 = null;
  91.  
  92.          for(int var10 = 0; var10 < var1.length; ++var10) {
  93.             int var11 = var1[var10].getModifiers();
  94.             if (!Modifier.isPublic(var11)) {
  95.                String var12 = var1[var10].getName();
  96.                int var13 = var12.lastIndexOf(46);
  97.                String var14 = var13 == -1 ? "" : var12.substring(0, var13 + 1);
  98.                if (var40 == null) {
  99.                   var40 = var14;
  100.                } else if (!var14.equals(var40)) {
  101.                   throw new IllegalArgumentException("non-public interfaces from different packages");
  102.                }
  103.             }
  104.          }
  105.  
  106.          if (var40 == null) {
  107.             var40 = "";
  108.          }
  109.  
  110.          Object var42 = nextUniqueNumberLock;
  111.          long var41;
  112.          synchronized(var42) {
  113.             var41 = (long)(nextUniqueNumber++);
  114.          }
  115.  
  116.          String var15 = var40 + "$Proxy" + var41;
  117.          byte[] var16 = ProxyGenerator.generateProxyClass(var15, var1);
  118.  
  119.          try {
  120.             var2 = defineClass0(var0, var15, var16, 0, var16.length);
  121.          } catch (ClassFormatError var32) {
  122.             throw new IllegalArgumentException(((Throwable)var32).toString());
  123.          }
  124.  
  125.          proxyClasses.put(var2, (Object)null);
  126.       } finally {
  127.          synchronized(var6) {
  128.             if (var2 != null) {
  129.                ((Map)var6).put(var39, new WeakReference(var2));
  130.             } else {
  131.                ((Map)var6).remove(var39);
  132.             }
  133.  
  134.             var6.notifyAll();
  135.          }
  136.       }
  137.  
  138.       return var2;
  139.    }
  140.  
  141.    public static Object newProxyInstance(ClassLoader var0, Class[] var1, InvocationHandler var2) throws IllegalArgumentException {
  142.       if (var2 == null) {
  143.          throw new NullPointerException();
  144.       } else {
  145.          Class var3 = getProxyClass(var0, var1);
  146.  
  147.          try {
  148.             Constructor var4 = var3.getConstructor(constructorParams);
  149.             return var4.newInstance(var2);
  150.          } catch (NoSuchMethodException var8) {
  151.             throw new InternalError(((Throwable)var8).toString());
  152.          } catch (IllegalAccessException var9) {
  153.             throw new InternalError(((Throwable)var9).toString());
  154.          } catch (InstantiationException var10) {
  155.             throw new InternalError(((Throwable)var10).toString());
  156.          } catch (InvocationTargetException var11) {
  157.             throw new InternalError(((Throwable)var11).toString());
  158.          }
  159.       }
  160.    }
  161.  
  162.    public static boolean isProxyClass(Class var0) {
  163.       if (var0 == null) {
  164.          throw new NullPointerException();
  165.       } else {
  166.          return proxyClasses.containsKey(var0);
  167.       }
  168.    }
  169.  
  170.    public static InvocationHandler getInvocationHandler(Object var0) throws IllegalArgumentException {
  171.       if (!isProxyClass(var0.getClass())) {
  172.          throw new IllegalArgumentException("not a proxy instance");
  173.       } else {
  174.          Proxy var1 = (Proxy)var0;
  175.          return var1.field_0;
  176.       }
  177.    }
  178.  
  179.    private static native Class defineClass0(ClassLoader var0, String var1, byte[] var2, int var3, int var4);
  180.  
  181.    // $FF: synthetic method
  182.    static Class class$(String var0) {
  183.       try {
  184.          return Class.forName(var0);
  185.       } catch (ClassNotFoundException var2) {
  186.          throw new NoClassDefFoundError(((Throwable)var2).getMessage());
  187.       }
  188.    }
  189.  
  190.    static {
  191.       constructorParams = new Class[]{class$java$lang$reflect$InvocationHandler == null ? (class$java$lang$reflect$InvocationHandler = class$("java.lang.reflect.InvocationHandler")) : class$java$lang$reflect$InvocationHandler};
  192.       loaderToCache = new WeakHashMap(3);
  193.       pendingGenerationMarker = new Object();
  194.       nextUniqueNumber = 0L;
  195.       nextUniqueNumberLock = new Object();
  196.       proxyClasses = Collections.synchronizedMap(new WeakHashMap(3));
  197.    }
  198. }
  199.