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 / beans / Introspector.class (.txt) < prev    next >
Encoding:
Java Class File  |  1979-12-31  |  12.3 KB  |  773 lines

  1. package java.beans;
  2.  
  3. import java.lang.reflect.Method;
  4. import java.lang.reflect.Modifier;
  5. import java.security.AccessController;
  6. import java.util.Enumeration;
  7. import java.util.Hashtable;
  8.  
  9. public class Introspector {
  10.    public static final int USE_ALL_BEANINFO = 1;
  11.    public static final int IGNORE_IMMEDIATE_BEANINFO = 2;
  12.    public static final int IGNORE_ALL_BEANINFO = 3;
  13.    private BeanInfo informant;
  14.    private boolean propertyChangeSource = false;
  15.    private Class beanClass;
  16.    private BeanInfo superBeanInfo;
  17.    private BeanInfo[] additionalBeanInfo;
  18.    private static Hashtable beanInfoCache = new Hashtable();
  19.    private static Class eventListenerType;
  20.    private String defaultEventName;
  21.    private String defaultPropertyName;
  22.    private int defaultEventIndex = -1;
  23.    private int defaultPropertyIndex = -1;
  24.    private Hashtable methods = new Hashtable();
  25.    private static Hashtable declaredMethodCache;
  26.    private Hashtable properties = new Hashtable();
  27.    private Hashtable events = new Hashtable();
  28.    private static String[] searchPath;
  29.    // $FF: synthetic field
  30.    static Class class$java$beans$BeanInfo;
  31.    // $FF: synthetic field
  32.    static Class class$java$beans$PropertyVetoException;
  33.    // $FF: synthetic field
  34.    static Class class$java$util$TooManyListenersException;
  35.    // $FF: synthetic field
  36.    static Class class$java$util$EventObject;
  37.    // $FF: synthetic field
  38.    static Class class$java$util$EventListener;
  39.  
  40.    public static BeanInfo getBeanInfo(Class var0) throws IntrospectionException {
  41.       GenericBeanInfo var1 = (GenericBeanInfo)beanInfoCache.get(var0);
  42.       if (var1 == null) {
  43.          var1 = (new Introspector(var0, (Class)null, 1)).getBeanInfo();
  44.          beanInfoCache.put(var0, var1);
  45.       }
  46.  
  47.       return new GenericBeanInfo(var1);
  48.    }
  49.  
  50.    public static BeanInfo getBeanInfo(Class var0, int var1) throws IntrospectionException {
  51.       GenericBeanInfo var2 = (new Introspector(var0, (Class)null, var1)).getBeanInfo();
  52.       return new GenericBeanInfo(var2);
  53.    }
  54.  
  55.    public static BeanInfo getBeanInfo(Class var0, Class var1) throws IntrospectionException {
  56.       GenericBeanInfo var2 = (new Introspector(var0, var1, 1)).getBeanInfo();
  57.       return new GenericBeanInfo(var2);
  58.    }
  59.  
  60.    public static String decapitalize(String var0) {
  61.       if (var0 != null && var0.length() != 0) {
  62.          if (var0.length() > 1 && Character.isUpperCase(var0.charAt(1)) && Character.isUpperCase(var0.charAt(0))) {
  63.             return var0;
  64.          } else {
  65.             char[] var1 = var0.toCharArray();
  66.             var1[0] = Character.toLowerCase(var1[0]);
  67.             return new String(var1);
  68.          }
  69.       } else {
  70.          return var0;
  71.       }
  72.    }
  73.  
  74.    public static synchronized String[] getBeanInfoSearchPath() {
  75.       String[] var0 = new String[searchPath.length];
  76.  
  77.       for(int var1 = 0; var1 < searchPath.length; ++var1) {
  78.          var0[var1] = searchPath[var1];
  79.       }
  80.  
  81.       return var0;
  82.    }
  83.  
  84.    public static synchronized void setBeanInfoSearchPath(String[] var0) {
  85.       SecurityManager var1 = System.getSecurityManager();
  86.       if (var1 != null) {
  87.          var1.checkPropertiesAccess();
  88.       }
  89.  
  90.       searchPath = var0;
  91.    }
  92.  
  93.    public static void flushCaches() {
  94.       beanInfoCache.clear();
  95.       declaredMethodCache.clear();
  96.    }
  97.  
  98.    public static void flushFromCaches(Class var0) {
  99.       beanInfoCache.remove(var0);
  100.       declaredMethodCache.remove(var0);
  101.    }
  102.  
  103.    private Introspector(Class var1, Class var2, int var3) throws IntrospectionException {
  104.       this.beanClass = var1;
  105.       if (var2 != null) {
  106.          boolean var4 = false;
  107.  
  108.          for(Class var5 = var1.getSuperclass(); var5 != null; var5 = var5.getSuperclass()) {
  109.             if (var5 == var2) {
  110.                var4 = true;
  111.             }
  112.          }
  113.  
  114.          if (!var4) {
  115.             throw new IntrospectionException(var2.getName() + " not superclass of " + var1.getName());
  116.          }
  117.       }
  118.  
  119.       if (var3 == 1) {
  120.          this.informant = findInformant(var1);
  121.       }
  122.  
  123.       Class var7 = var1.getSuperclass();
  124.       if (var7 != var2) {
  125.          int var8 = var3;
  126.          if (var3 == 2) {
  127.             var8 = 1;
  128.          }
  129.  
  130.          if (var2 == null && var8 == 1) {
  131.             this.superBeanInfo = (BeanInfo)beanInfoCache.get(var7);
  132.             if (this.superBeanInfo == null) {
  133.                Introspector var9 = new Introspector(var7, (Class)null, 1);
  134.                this.superBeanInfo = var9.getBeanInfo();
  135.                beanInfoCache.put(var7, this.superBeanInfo);
  136.             }
  137.          } else {
  138.             Introspector var6 = new Introspector(var7, var2, var8);
  139.             this.superBeanInfo = var6.getBeanInfo();
  140.          }
  141.       }
  142.  
  143.       if (this.informant != null) {
  144.          this.additionalBeanInfo = this.informant.getAdditionalBeanInfo();
  145.       }
  146.  
  147.       if (this.additionalBeanInfo == null) {
  148.          this.additionalBeanInfo = new BeanInfo[0];
  149.       }
  150.  
  151.    }
  152.  
  153.    private GenericBeanInfo getBeanInfo() throws IntrospectionException {
  154.       BeanDescriptor var1 = this.getTargetBeanDescriptor();
  155.       EventSetDescriptor[] var2 = this.getTargetEventInfo();
  156.       int var3 = this.getTargetDefaultEventIndex();
  157.       PropertyDescriptor[] var4 = this.getTargetPropertyInfo();
  158.       int var5 = this.getTargetDefaultPropertyIndex();
  159.       MethodDescriptor[] var6 = this.getTargetMethodInfo();
  160.       return new GenericBeanInfo(var1, var2, var3, var4, var5, var6, this.informant);
  161.    }
  162.  
  163.    private static synchronized BeanInfo findInformant(Class var0) {
  164.       String var1 = var0.getName() + "BeanInfo";
  165.  
  166.       try {
  167.          return (BeanInfo)instantiate(var0, var1);
  168.       } catch (Exception var6) {
  169.          try {
  170.             if (isSubclass(var0, class$java$beans$BeanInfo == null ? (class$java$beans$BeanInfo = class$("java.beans.BeanInfo")) : class$java$beans$BeanInfo)) {
  171.                return (BeanInfo)var0.newInstance();
  172.             }
  173.          } catch (Exception var4) {
  174.          }
  175.  
  176.          while(var1.indexOf(46) > 0) {
  177.             var1 = var1.substring(var1.indexOf(46) + 1);
  178.          }
  179.  
  180.          for(int var2 = 0; var2 < searchPath.length; ++var2) {
  181.             try {
  182.                String var3 = searchPath[var2] + "." + var1;
  183.                return (BeanInfo)instantiate(var0, var3);
  184.             }
  185.          }
  186.  
  187.          return null;
  188.       }
  189.    }
  190.  
  191.    private PropertyDescriptor[] getTargetPropertyInfo() throws IntrospectionException {
  192.       PropertyDescriptor[] var1 = null;
  193.       if (this.informant != null) {
  194.          var1 = this.informant.getPropertyDescriptors();
  195.          int var2 = this.informant.getDefaultPropertyIndex();
  196.          if (var2 >= 0 && var2 < var1.length) {
  197.             this.defaultPropertyName = var1[var2].getName();
  198.          }
  199.       }
  200.  
  201.       if (var1 == null && this.superBeanInfo != null) {
  202.          PropertyDescriptor[] var14 = this.superBeanInfo.getPropertyDescriptors();
  203.  
  204.          for(int var3 = 0; var3 < var14.length; ++var3) {
  205.             this.addProperty(var14[var3]);
  206.          }
  207.  
  208.          int var4 = this.superBeanInfo.getDefaultPropertyIndex();
  209.          if (var4 >= 0 && var4 < var14.length) {
  210.             this.defaultPropertyName = var14[var4].getName();
  211.          }
  212.       }
  213.  
  214.       for(int var15 = 0; var15 < this.additionalBeanInfo.length; ++var15) {
  215.          PropertyDescriptor[] var16 = this.additionalBeanInfo[var15].getPropertyDescriptors();
  216.          if (var16 != null) {
  217.             for(int var20 = 0; var20 < var16.length; ++var20) {
  218.                this.addProperty(var16[var20]);
  219.             }
  220.          }
  221.       }
  222.  
  223.       if (var1 != null) {
  224.          for(int var17 = 0; var17 < var1.length; ++var17) {
  225.             this.addProperty(var1[var17]);
  226.          }
  227.       } else {
  228.          Method[] var18 = getPublicDeclaredMethods(this.beanClass);
  229.  
  230.          for(int var21 = 0; var21 < var18.length; ++var21) {
  231.             Method var5 = var18[var21];
  232.             if (var5 != null) {
  233.                int var6 = var5.getModifiers();
  234.                if (!Modifier.isStatic(var6)) {
  235.                   String var7 = var5.getName();
  236.                   Class[] var8 = var5.getParameterTypes();
  237.                   Class var9 = var5.getReturnType();
  238.                   int var10 = var8.length;
  239.                   Object var11 = null;
  240.  
  241.                   try {
  242.                      if (var10 == 0) {
  243.                         if (var7.startsWith("get")) {
  244.                            var11 = new PropertyDescriptor(decapitalize(var7.substring(3)), var5, (Method)null);
  245.                         } else if (var9 == Boolean.TYPE && var7.startsWith("is")) {
  246.                            var11 = new PropertyDescriptor(decapitalize(var7.substring(2)), var5, (Method)null);
  247.                         }
  248.                      } else if (var10 == 1) {
  249.                         if (var8[0] == Integer.TYPE && var7.startsWith("get")) {
  250.                            var11 = new IndexedPropertyDescriptor(decapitalize(var7.substring(3)), (Method)null, (Method)null, var5, (Method)null);
  251.                         } else if (var9 == Void.TYPE && var7.startsWith("set")) {
  252.                            var11 = new PropertyDescriptor(decapitalize(var7.substring(3)), (Method)null, var5);
  253.                            if (this.throwsException(var5, class$java$beans$PropertyVetoException == null ? (class$java$beans$PropertyVetoException = class$("java.beans.PropertyVetoException")) : class$java$beans$PropertyVetoException)) {
  254.                               ((PropertyDescriptor)var11).setConstrained(true);
  255.                            }
  256.                         }
  257.                      } else if (var10 == 2 && var8[0] == Integer.TYPE && var7.startsWith("set")) {
  258.                         var11 = new IndexedPropertyDescriptor(decapitalize(var7.substring(3)), (Method)null, (Method)null, (Method)null, var5);
  259.                         if (this.throwsException(var5, class$java$beans$PropertyVetoException == null ? (class$java$beans$PropertyVetoException = class$("java.beans.PropertyVetoException")) : class$java$beans$PropertyVetoException)) {
  260.                            ((PropertyDescriptor)var11).setConstrained(true);
  261.                         }
  262.                      }
  263.                   } catch (IntrospectionException var13) {
  264.                      var11 = null;
  265.                   }
  266.  
  267.                   if (var11 != null) {
  268.                      if (this.propertyChangeSource) {
  269.                         ((PropertyDescriptor)var11).setBound(true);
  270.                      }
  271.  
  272.                      this.addProperty((PropertyDescriptor)var11);
  273.                   }
  274.                }
  275.             }
  276.          }
  277.       }
  278.  
  279.       PropertyDescriptor[] var19 = new PropertyDescriptor[this.properties.size()];
  280.       Enumeration var22 = this.properties.elements();
  281.  
  282.       for(int var23 = 0; var23 < var19.length; ++var23) {
  283.          var19[var23] = (PropertyDescriptor)var22.nextElement();
  284.          if (this.defaultPropertyName != null && this.defaultPropertyName.equals(var19[var23].getName())) {
  285.             this.defaultPropertyIndex = var23;
  286.          }
  287.       }
  288.  
  289.       return var19;
  290.    }
  291.  
  292.    void addProperty(PropertyDescriptor var1) {
  293.       String var2 = ((FeatureDescriptor)var1).getName();
  294.       PropertyDescriptor var3 = (PropertyDescriptor)this.properties.get(var2);
  295.       if (var3 == null) {
  296.          this.properties.put(var2, var1);
  297.       } else {
  298.          Class var4 = var3.getPropertyType();
  299.          Class var5 = var1.getPropertyType();
  300.          if (var4 != null && var5 != null && var4 != var5) {
  301.             if (var1.getWriteMethod() != null && var1.getReadMethod() != null || var3.getWriteMethod() == null && var1.getWriteMethod() == null || var3.getReadMethod() == null && var1.getReadMethod() == null) {
  302.                this.properties.put(var2, var1);
  303.             }
  304.  
  305.          } else {
  306.             Object var6;
  307.             if (!(var3 instanceof IndexedPropertyDescriptor) && !(var1 instanceof IndexedPropertyDescriptor)) {
  308.                var6 = new PropertyDescriptor(var3, var1);
  309.             } else {
  310.                var6 = new IndexedPropertyDescriptor(var3, var1);
  311.             }
  312.  
  313.             this.properties.put(var2, var6);
  314.          }
  315.       }
  316.    }
  317.  
  318.    private EventSetDescriptor[] getTargetEventInfo() throws IntrospectionException {
  319.       EventSetDescriptor[] var1 = null;
  320.       if (this.informant != null) {
  321.          var1 = this.informant.getEventSetDescriptors();
  322.          int var2 = this.informant.getDefaultEventIndex();
  323.          if (var2 >= 0 && var2 < var1.length) {
  324.             this.defaultEventName = var1[var2].getName();
  325.          }
  326.       }
  327.  
  328.       if (var1 == null && this.superBeanInfo != null) {
  329.          EventSetDescriptor[] var22 = this.superBeanInfo.getEventSetDescriptors();
  330.  
  331.          for(int var3 = 0; var3 < var22.length; ++var3) {
  332.             this.addEvent(var22[var3]);
  333.          }
  334.  
  335.          int var4 = this.superBeanInfo.getDefaultEventIndex();
  336.          if (var4 >= 0 && var4 < var22.length) {
  337.             this.defaultEventName = var22[var4].getName();
  338.          }
  339.       }
  340.  
  341.       for(int var23 = 0; var23 < this.additionalBeanInfo.length; ++var23) {
  342.          EventSetDescriptor[] var24 = this.additionalBeanInfo[var23].getEventSetDescriptors();
  343.          if (var24 != null) {
  344.             for(int var28 = 0; var28 < var24.length; ++var28) {
  345.                this.addEvent(var24[var28]);
  346.             }
  347.          }
  348.       }
  349.  
  350.       if (var1 != null) {
  351.          for(int var25 = 0; var25 < var1.length; ++var25) {
  352.             this.addEvent(var1[var25]);
  353.          }
  354.       } else {
  355.          Method[] var26 = getPublicDeclaredMethods(this.beanClass);
  356.          Hashtable var29 = new Hashtable();
  357.          Hashtable var5 = new Hashtable();
  358.  
  359.          for(int var6 = 0; var6 < var26.length; ++var6) {
  360.             Method var7 = var26[var6];
  361.             if (var7 != null) {
  362.                int var8 = var7.getModifiers();
  363.                if (!Modifier.isStatic(var8)) {
  364.                   String var9 = var7.getName();
  365.                   Class[] var10 = var7.getParameterTypes();
  366.                   Class var11 = var7.getReturnType();
  367.                   if (var9.startsWith("add") && var10.length == 1 && var11 == Void.TYPE) {
  368.                      String var37 = var9.substring(3) + ":" + var10[0];
  369.                      var29.put(var37, var7);
  370.                   } else if (var9.startsWith("remove") && var10.length == 1 && var11 == Void.TYPE) {
  371.                      String var12 = var9.substring(6) + ":" + var10[0];
  372.                      var5.put(var12, var7);
  373.                   }
  374.                }
  375.             }
  376.          }
  377.  
  378.          Enumeration var32 = var29.keys();
  379.          String var33 = this.beanClass.getName();
  380.  
  381.          while(var32.hasMoreElements()) {
  382.             String var34 = (String)var32.nextElement();
  383.             if (var5.get(var34) != null && var34.indexOf("Listener:") > 0) {
  384.                String var35 = var34.substring(0, var34.indexOf(58));
  385.                String var36 = decapitalize(var35.substring(0, var35.length() - 8));
  386.                Method var38 = (Method)var29.get(var34);
  387.                Method var13 = (Method)var5.get(var34);
  388.                Class var14 = var38.getParameterTypes()[0];
  389.                if (isSubclass(var14, eventListenerType)) {
  390.                   Method[] var15 = var14.getMethods();
  391.                   int var16 = 0;
  392.  
  393.                   for(int var17 = 0; var17 < var15.length; ++var17) {
  394.                      if (this.isEventHandler(var15[var17])) {
  395.                         ++var16;
  396.                      } else {
  397.                         var15[var17] = null;
  398.                      }
  399.                   }
  400.  
  401.                   Method[] var18 = new Method[var16];
  402.                   int var19 = 0;
  403.  
  404.                   for(int var20 = 0; var20 < var15.length; ++var20) {
  405.                      if (var15[var20] != null) {
  406.                         var18[var19++] = var15[var20];
  407.                      }
  408.                   }
  409.  
  410.                   EventSetDescriptor var21 = new EventSetDescriptor(var36, var14, var18, var38, var13);
  411.                   if (this.throwsException(var38, class$java$util$TooManyListenersException == null ? (class$java$util$TooManyListenersException = class$("java.util.TooManyListenersException")) : class$java$util$TooManyListenersException)) {
  412.                      var21.setUnicast(true);
  413.                   }
  414.  
  415.                   this.addEvent(var21);
  416.                }
  417.             }
  418.          }
  419.       }
  420.  
  421.       EventSetDescriptor[] var27 = new EventSetDescriptor[this.events.size()];
  422.       Enumeration var30 = this.events.elements();
  423.  
  424.       for(int var31 = 0; var31 < var27.length; ++var31) {
  425.          var27[var31] = (EventSetDescriptor)var30.nextElement();
  426.          if (this.defaultEventName != null && this.defaultEventName.equals(var27[var31].getName())) {
  427.             this.defaultEventIndex = var31;
  428.          }
  429.       }
  430.  
  431.       return var27;
  432.    }
  433.  
  434.    void addEvent(EventSetDescriptor var1) {
  435.       String var2 = ((FeatureDescriptor)var1).getName() + var1.getListenerType();
  436.       if (((FeatureDescriptor)var1).getName().equals("propertyChange")) {
  437.          this.propertyChangeSource = true;
  438.       }
  439.  
  440.       EventSetDescriptor var3 = (EventSetDescriptor)this.events.get(var2);
  441.       if (var3 == null) {
  442.          this.events.put(var2, var1);
  443.       } else {
  444.          EventSetDescriptor var4 = new EventSetDescriptor(var3, var1);
  445.          this.events.put(var2, var4);
  446.       }
  447.    }
  448.  
  449.    private MethodDescriptor[] getTargetMethodInfo() throws IntrospectionException {
  450.       MethodDescriptor[] var1 = null;
  451.       if (this.informant != null) {
  452.          var1 = this.informant.getMethodDescriptors();
  453.       }
  454.  
  455.       if (var1 == null && this.superBeanInfo != null) {
  456.          MethodDescriptor[] var2 = this.superBeanInfo.getMethodDescriptors();
  457.  
  458.          for(int var3 = 0; var3 < var2.length; ++var3) {
  459.             this.addMethod(var2[var3]);
  460.          }
  461.       }
  462.  
  463.       for(int var7 = 0; var7 < this.additionalBeanInfo.length; ++var7) {
  464.          MethodDescriptor[] var8 = this.additionalBeanInfo[var7].getMethodDescriptors();
  465.          if (var8 != null) {
  466.             for(int var4 = 0; var4 < var8.length; ++var4) {
  467.                this.addMethod(var8[var4]);
  468.             }
  469.          }
  470.       }
  471.  
  472.       if (var1 != null) {
  473.          for(int var9 = 0; var9 < var1.length; ++var9) {
  474.             this.addMethod(var1[var9]);
  475.          }
  476.       } else {
  477.          Method[] var10 = getPublicDeclaredMethods(this.beanClass);
  478.  
  479.          for(int var12 = 0; var12 < var10.length; ++var12) {
  480.             Method var5 = var10[var12];
  481.             if (var5 != null) {
  482.                MethodDescriptor var6 = new MethodDescriptor(var5);
  483.                this.addMethod(var6);
  484.             }
  485.          }
  486.       }
  487.  
  488.       MethodDescriptor[] var11 = new MethodDescriptor[this.methods.size()];
  489.       Enumeration var13 = this.methods.elements();
  490.  
  491.       for(int var14 = 0; var14 < var11.length; ++var14) {
  492.          var11[var14] = (MethodDescriptor)var13.nextElement();
  493.       }
  494.  
  495.       return var11;
  496.    }
  497.  
  498.    private void addMethod(MethodDescriptor var1) {
  499.       String var2 = var1.getMethod().getName();
  500.       MethodDescriptor var3 = (MethodDescriptor)this.methods.get(var2);
  501.       if (var3 == null) {
  502.          this.methods.put(var2, var1);
  503.       } else {
  504.          Class[] var4 = var1.getMethod().getParameterTypes();
  505.          Class[] var5 = var3.getMethod().getParameterTypes();
  506.          boolean var6 = false;
  507.          if (var4.length == var5.length) {
  508.             var6 = true;
  509.  
  510.             for(int var7 = 0; var7 < var4.length; ++var7) {
  511.                if (var4[var7] != var5[var7]) {
  512.                   var6 = false;
  513.                   break;
  514.                }
  515.             }
  516.          }
  517.  
  518.          if (var6) {
  519.             MethodDescriptor var11 = new MethodDescriptor(var3, var1);
  520.             this.methods.put(var2, var11);
  521.          } else {
  522.             String var10 = this.makeQualifiedMethodName(var1);
  523.             var3 = (MethodDescriptor)this.methods.get(var10);
  524.             if (var3 == null) {
  525.                this.methods.put(var10, var1);
  526.             } else {
  527.                MethodDescriptor var8 = new MethodDescriptor(var3, var1);
  528.                this.methods.put(var10, var8);
  529.             }
  530.          }
  531.       }
  532.    }
  533.  
  534.    private String makeQualifiedMethodName(MethodDescriptor var1) {
  535.       Method var2 = var1.getMethod();
  536.       StringBuffer var3 = new StringBuffer();
  537.       var3.append(var2.getName());
  538.       var3.append("=");
  539.       Class[] var4 = var2.getParameterTypes();
  540.  
  541.       for(int var5 = 0; var5 < var4.length; ++var5) {
  542.          var3.append(":");
  543.          var3.append(var4[var5].getName());
  544.       }
  545.  
  546.       return var3.toString();
  547.    }
  548.  
  549.    private int getTargetDefaultEventIndex() {
  550.       return this.defaultEventIndex;
  551.    }
  552.  
  553.    private int getTargetDefaultPropertyIndex() {
  554.       return this.defaultPropertyIndex;
  555.    }
  556.  
  557.    private BeanDescriptor getTargetBeanDescriptor() throws IntrospectionException {
  558.       if (this.informant != null) {
  559.          BeanDescriptor var1 = this.informant.getBeanDescriptor();
  560.          if (var1 != null) {
  561.             return var1;
  562.          }
  563.       }
  564.  
  565.       return new BeanDescriptor(this.beanClass);
  566.    }
  567.  
  568.    private boolean isEventHandler(Method var1) throws IntrospectionException {
  569.       try {
  570.          Class[] var2 = var1.getParameterTypes();
  571.          if (var2.length != 1) {
  572.             return false;
  573.          } else {
  574.             return isSubclass(var2[0], class$java$util$EventObject == null ? (class$java$util$EventObject = class$("java.util.EventObject")) : class$java$util$EventObject);
  575.          }
  576.       } catch (Exception var3) {
  577.          throw new IntrospectionException("Unexpected reflection exception: " + var3);
  578.       }
  579.    }
  580.  
  581.    private static synchronized Method[] getPublicDeclaredMethods(Class var0) {
  582.       Method[] var2 = (Method[])declaredMethodCache.get(var0);
  583.       if (var2 != null) {
  584.          return var2;
  585.       } else {
  586.          var2 = (Method[])AccessController.doPrivileged(new 1(var0));
  587.  
  588.          for(int var3 = 0; var3 < var2.length; ++var3) {
  589.             Method var4 = var2[var3];
  590.             int var5 = var4.getModifiers();
  591.             if (!Modifier.isPublic(var5)) {
  592.                var2[var3] = null;
  593.             }
  594.          }
  595.  
  596.          declaredMethodCache.put(var0, var2);
  597.          return var2;
  598.       }
  599.    }
  600.  
  601.    private static Method internalFindMethod(Class var0, String var1, int var2) {
  602.       for(Class var3 = var0; var3 != null; var3 = var3.getSuperclass()) {
  603.          Method[] var4 = getPublicDeclaredMethods(var3);
  604.  
  605.          for(int var5 = 0; var5 < var4.length; ++var5) {
  606.             Method var6 = var4[var5];
  607.             if (var6 != null) {
  608.                int var7 = var6.getModifiers();
  609.                if (!Modifier.isStatic(var7) && var6.getName().equals(var1) && var6.getParameterTypes().length == var2) {
  610.                   return var6;
  611.                }
  612.             }
  613.          }
  614.       }
  615.  
  616.       Class[] var8 = var0.getInterfaces();
  617.  
  618.       for(int var9 = 0; var9 < var8.length; ++var9) {
  619.          Method var10 = internalFindMethod(var8[var9], var1, var2);
  620.          if (var10 != null) {
  621.             return var10;
  622.          }
  623.       }
  624.  
  625.       return null;
  626.    }
  627.  
  628.    private static Method internalFindMethod(Class var0, String var1, int var2, Class[] var3) {
  629.       for(Class var4 = var0; var4 != null; var4 = var4.getSuperclass()) {
  630.          Method[] var5 = getPublicDeclaredMethods(var4);
  631.  
  632.          for(int var6 = 0; var6 < var5.length; ++var6) {
  633.             Method var7 = var5[var6];
  634.             if (var7 != null) {
  635.                int var8 = var7.getModifiers();
  636.                if (!Modifier.isStatic(var8)) {
  637.                   Class[] var9 = var7.getParameterTypes();
  638.                   if (var7.getName().equals(var1) && var9.length == var2) {
  639.                      boolean var10 = false;
  640.                      if (var2 <= 0) {
  641.                         return var7;
  642.                      }
  643.  
  644.                      for(int var11 = 0; var11 < var2; ++var11) {
  645.                         if (var9[var11] != var3[var11]) {
  646.                            var10 = true;
  647.                         }
  648.                      }
  649.  
  650.                      if (!var10) {
  651.                         return var7;
  652.                      }
  653.                   }
  654.                }
  655.             }
  656.          }
  657.       }
  658.  
  659.       Class[] var12 = var0.getInterfaces();
  660.  
  661.       for(int var13 = 0; var13 < var12.length; ++var13) {
  662.          Method var14 = internalFindMethod(var12[var13], var1, var2);
  663.          if (var14 != null) {
  664.             return var14;
  665.          }
  666.       }
  667.  
  668.       return null;
  669.    }
  670.  
  671.    static Method findMethod(Class var0, String var1, int var2) throws IntrospectionException {
  672.       if (var1 == null) {
  673.          return null;
  674.       } else {
  675.          Method var3 = internalFindMethod(var0, var1, var2);
  676.          if (var3 != null) {
  677.             return var3;
  678.          } else {
  679.             throw new IntrospectionException("No method \"" + var1 + "\" with " + var2 + " arg(s)");
  680.          }
  681.       }
  682.    }
  683.  
  684.    static Method findMethod(Class var0, String var1, int var2, Class[] var3) throws IntrospectionException {
  685.       if (var1 == null) {
  686.          return null;
  687.       } else {
  688.          Method var4 = internalFindMethod(var0, var1, var2, var3);
  689.          if (var4 != null) {
  690.             return var4;
  691.          } else {
  692.             throw new IntrospectionException("No method \"" + var1 + "\" with " + var2 + " arg(s) of matching types.");
  693.          }
  694.       }
  695.    }
  696.  
  697.    static boolean isSubclass(Class var0, Class var1) {
  698.       if (var0 == var1) {
  699.          return true;
  700.       } else if (var0 != null && var1 != null) {
  701.          for(Class var2 = var0; var2 != null; var2 = var2.getSuperclass()) {
  702.             if (var2 == var1) {
  703.                return true;
  704.             }
  705.  
  706.             if (var1.isInterface()) {
  707.                Class[] var3 = var2.getInterfaces();
  708.  
  709.                for(int var4 = 0; var4 < var3.length; ++var4) {
  710.                   if (isSubclass(var3[var4], var1)) {
  711.                      return true;
  712.                   }
  713.                }
  714.             }
  715.          }
  716.  
  717.          return false;
  718.       } else {
  719.          return false;
  720.       }
  721.    }
  722.  
  723.    private boolean throwsException(Method var1, Class var2) {
  724.       Class[] var3 = var1.getExceptionTypes();
  725.  
  726.       for(int var4 = 0; var4 < var3.length; ++var4) {
  727.          if (var3[var4] == var2) {
  728.             return true;
  729.          }
  730.       }
  731.  
  732.       return false;
  733.    }
  734.  
  735.    static Object instantiate(Class var0, String var1) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
  736.       ClassLoader var2 = var0.getClassLoader();
  737.       if (var2 != null) {
  738.          try {
  739.             Class var8 = var2.loadClass(var1);
  740.             return var8.newInstance();
  741.          } catch (Exception var5) {
  742.          }
  743.       }
  744.  
  745.       try {
  746.          var2 = ClassLoader.getSystemClassLoader();
  747.          if (var2 != null) {
  748.             Class var7 = var2.loadClass(var1);
  749.             return var7.newInstance();
  750.          }
  751.       } catch (Exception var4) {
  752.       }
  753.  
  754.       Class var3 = Class.forName(var1);
  755.       return var3.newInstance();
  756.    }
  757.  
  758.    // $FF: synthetic method
  759.    static Class class$(String var0) {
  760.       try {
  761.          return Class.forName(var0);
  762.       } catch (ClassNotFoundException var2) {
  763.          throw new NoClassDefFoundError(((Throwable)var2).getMessage());
  764.       }
  765.    }
  766.  
  767.    static {
  768.       eventListenerType = class$java$util$EventListener == null ? (class$java$util$EventListener = class$("java.util.EventListener")) : class$java$util$EventListener;
  769.       declaredMethodCache = new Hashtable();
  770.       searchPath = new String[]{"sun.beans.infos"};
  771.    }
  772. }
  773.