home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML ConsoleMax.sea / XML ConsoleMax / Required / bsf.jar / com / ibm / cs / util / ReflectionUtils.class (.txt) < prev    next >
Encoding:
Java Class File  |  1999-09-24  |  7.6 KB  |  266 lines

  1. package com.ibm.cs.util;
  2.  
  3. import com.ibm.cs.event.EventAdapter;
  4. import com.ibm.cs.event.EventAdapterRegistry;
  5. import com.ibm.cs.event.EventProcessor;
  6. import java.beans.BeanInfo;
  7. import java.beans.Beans;
  8. import java.beans.EventSetDescriptor;
  9. import java.beans.FeatureDescriptor;
  10. import java.beans.IntrospectionException;
  11. import java.beans.Introspector;
  12. import java.io.IOException;
  13. import java.lang.reflect.Constructor;
  14. import java.lang.reflect.InvocationTargetException;
  15. import java.lang.reflect.Method;
  16. import java.lang.reflect.Modifier;
  17.  
  18. public class ReflectionUtils {
  19.    static boolean debug;
  20.  
  21.    private static FeatureDescriptor findFeatureByName(String var0, String var1, FeatureDescriptor[] var2) {
  22.       for(int var3 = 0; var3 < var2.length; ++var3) {
  23.          if (var1.equals(var2[var3].getName())) {
  24.             return var2[var3];
  25.          }
  26.       }
  27.  
  28.       return null;
  29.    }
  30.  
  31.    public static Object createBean(ClassLoader var0, String var1, Class[] var2, Object[] var3) throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, IOException {
  32.       if (var2 != null) {
  33.          Class var4 = var0 != null ? var0.loadClass(var1) : Class.forName(var1);
  34.          Constructor var5 = getConstructor(var4, var2);
  35.          return var5.newInstance(var3);
  36.       } else {
  37.          return Beans.instantiate(var0, var1);
  38.       }
  39.    }
  40.  
  41.    public static Object createBean(ClassLoader var0, String var1, Object[] var2) throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, IOException {
  42.       Class[] var3 = null;
  43.       if (var2 != null) {
  44.          var3 = new Class[var2.length];
  45.  
  46.          for(int var4 = 0; var4 < var2.length; ++var4) {
  47.             var3[var4] = var2[var4] != null ? var2[var4].getClass() : null;
  48.          }
  49.       }
  50.  
  51.       return createBean(var0, var1, var3, var2);
  52.    }
  53.  
  54.    private static Object getEntryPoint(Class var0, String var1, Class[] var2, boolean var3) throws SecurityException, NoSuchMethodException {
  55.       Object var4 = null;
  56.  
  57.       try {
  58.          if (var1 != null) {
  59.             Method var13 = var0.getMethod(var1, var2);
  60.             if (var3 && !Modifier.isStatic(entryGetModifiers(var13))) {
  61.                throw new NoSuchMethodException(callToString(var0, var1, var2, var3) + " resolved to instance " + var13);
  62.             } else {
  63.                return var13;
  64.             }
  65.          } else {
  66.             return var0.getConstructor(var2);
  67.          }
  68.       } catch (NoSuchMethodException var11) {
  69.          if (var2 != null && var2.length != 0) {
  70.             Object var5;
  71.             Object var6;
  72.             if (var1 != null) {
  73.                var5 = var0.getDeclaredMethods();
  74.                var6 = var0.getMethods();
  75.             } else {
  76.                var5 = var0.getDeclaredConstructors();
  77.                var6 = var0.getConstructors();
  78.             }
  79.  
  80.             if (((Object[])var5).length + ((Object[])var6).length == 0) {
  81.                throw new NoSuchMethodException("No methods!");
  82.             } else {
  83.                Object[] var7 = new Object[((Object[])var5).length + ((Object[])var6).length];
  84.                System.arraycopy(var5, 0, var7, 0, ((Object[])var5).length);
  85.                System.arraycopy(var6, 0, var7, ((Object[])var5).length, ((Object[])var6).length);
  86.                MoreSpecific var8 = new MoreSpecific();
  87.  
  88.                for(int var9 = 0; var9 < var7.length; ++var9) {
  89.                   Object var10 = var7[var9];
  90.                   if (Modifier.isPublic(entryGetModifiers(var10)) && (var1 == null || entryGetName(var10).equals(var1)) && areMethodConvertable(entryGetParameterTypes(var10), var2)) {
  91.                      var8.addItem(var10);
  92.                   }
  93.                }
  94.  
  95.                var4 = var8.getMostSpecific(var0, var1, var2, var3);
  96.                if (var1 != null && var3 && !Modifier.isStatic(entryGetModifiers(var4))) {
  97.                   throw new NoSuchMethodException(callToString(var0, var1, var2, var3) + " resolved to instance: " + var4);
  98.                } else if (var4 == null) {
  99.                   throw new NoSuchMethodException(callToString(var0, var1, var2, var3) + " -- no signature match");
  100.                } else {
  101.                   return var4;
  102.                }
  103.             }
  104.          } else {
  105.             throw var11;
  106.          }
  107.       }
  108.    }
  109.  
  110.    private static String callToString(Class var0, String var1, Class[] var2, boolean var3) {
  111.       StringBuffer var4 = new StringBuffer();
  112.       if (var3) {
  113.          var4.append("static ");
  114.       }
  115.  
  116.       var4.append(var0.getName());
  117.       if (var1 != null) {
  118.          var4.append(".").append(var1);
  119.       }
  120.  
  121.       var4.append("(");
  122.       if (var2 != null && var2.length > 0) {
  123.          var4.append(var2[0]);
  124.  
  125.          for(int var5 = 1; var5 < var2.length; ++var5) {
  126.             var4.append(",").append(var2[var5]);
  127.          }
  128.       } else {
  129.          var4.append("[none]");
  130.       }
  131.  
  132.       var4.append(")");
  133.       return var4.toString();
  134.    }
  135.  
  136.    private static boolean isMethodConvertable(Class var0, Class var1) {
  137.       if (var0.equals(var1)) {
  138.          return true;
  139.       } else if (var1 == null) {
  140.          return !var0.isPrimitive();
  141.       } else {
  142.          while(var0.isArray()) {
  143.             if (!var1.isArray()) {
  144.                return false;
  145.             }
  146.  
  147.             var0 = var0.getComponentType();
  148.             var1 = var1.getComponentType();
  149.          }
  150.  
  151.          if (var1.isArray()) {
  152.             return false;
  153.          } else if (var0.isAssignableFrom(var1)) {
  154.             return true;
  155.          } else if (!var0.equals(Void.TYPE) && !var0.equals(Boolean.TYPE) && !var1.equals(Void.TYPE) && !var1.equals(Boolean.TYPE)) {
  156.             Class[] var2 = new Class[]{Character.TYPE, Byte.TYPE, Short.TYPE, Integer.TYPE, Long.TYPE, Float.TYPE, Double.TYPE};
  157.  
  158.             int var3;
  159.             for(var3 = 0; var3 < var2.length && !var0.equals(var2[var3]); ++var3) {
  160.             }
  161.  
  162.             if (var3 >= var2.length) {
  163.                return false;
  164.             } else {
  165.                int var4;
  166.                for(var4 = 0; var4 < var2.length && !var1.equals(var2[var4]); ++var4) {
  167.                }
  168.  
  169.                if (var4 >= var2.length) {
  170.                   return false;
  171.                } else {
  172.                   return var4 < var3 && (var4 != 0 || var3 > 2);
  173.                }
  174.             }
  175.          } else {
  176.             return false;
  177.          }
  178.       }
  179.    }
  180.  
  181.    private static boolean isAssignmentConvertable(Class var0, Class var1) {
  182.       return var1.equals(Integer.TYPE) && (var0.equals(Byte.TYPE) || var0.equals(Short.TYPE) || var0.equals(Character.TYPE)) || isMethodConvertable(var0, var1);
  183.    }
  184.  
  185.    private static boolean areMethodConvertable(Class[] var0, Class[] var1) {
  186.       if (var0.length != var1.length) {
  187.          return false;
  188.       } else {
  189.          for(int var2 = 0; var2 < var0.length; ++var2) {
  190.             if (!isMethodConvertable(var0[var2], var1[var2])) {
  191.                return false;
  192.             }
  193.          }
  194.  
  195.          return true;
  196.       }
  197.    }
  198.  
  199.    static String entryGetName(Object var0) {
  200.       return var0 instanceof Method ? ((Method)var0).getName() : ((Constructor)var0).getName();
  201.    }
  202.  
  203.    static int entryGetModifiers(Object var0) {
  204.       return var0 instanceof Method ? ((Method)var0).getModifiers() : ((Constructor)var0).getModifiers();
  205.    }
  206.  
  207.    static Class[] entryGetParameterTypes(Object var0) {
  208.       return var0 instanceof Method ? ((Method)var0).getParameterTypes() : ((Constructor)var0).getParameterTypes();
  209.    }
  210.  
  211.    static String entryToString(Object var0) {
  212.       return var0 instanceof Method ? ((Method)var0).toString() : ((Constructor)var0).toString();
  213.    }
  214.  
  215.    public static Method getMethod(Object var0, String var1, Class[] var2) throws SecurityException, NoSuchMethodException {
  216.       boolean var3 = var0 instanceof Class;
  217.       return getMethod(var3 ? (Class)var0 : var0.getClass(), var1, var2, var3);
  218.    }
  219.  
  220.    public static Method getMethod(Class var0, String var1, Class[] var2, boolean var3) throws SecurityException, NoSuchMethodException {
  221.       return (Method)getEntryPoint(var0, var1, var2, var3);
  222.    }
  223.  
  224.    public static Constructor getConstructor(Class var0, Class[] var1) throws SecurityException, NoSuchMethodException {
  225.       return (Constructor)getEntryPoint(var0, (String)null, var1, true);
  226.    }
  227.  
  228.    public static void addEventListener(Object var0, String var1, EventProcessor var2) throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InstantiationException, InvocationTargetException {
  229.       BeanInfo var3 = Introspector.getBeanInfo(var0.getClass());
  230.       EventSetDescriptor var4 = (EventSetDescriptor)findFeatureByName("event", var1, var3.getEventSetDescriptors());
  231.       if (var4 == null) {
  232.          throw new IllegalArgumentException("event set '" + var1 + "' unknown for source type '" + var0.getClass() + "'");
  233.       } else {
  234.          Class var5 = var4.getListenerType();
  235.          Class var6 = EventAdapterRegistry.lookup(var5);
  236.          if (var6 == null) {
  237.             throw new IllegalArgumentException("event adapter for listner type '" + var5 + "' (eventset " + "'" + var1 + "') unknown");
  238.          } else {
  239.             EventAdapter var7 = (EventAdapter)var6.newInstance();
  240.             var7.setEventProcessor(var2);
  241.             Method var8;
  242.             Object[] var9;
  243.             if (!var1.equals("propertyChange") && !var1.equals("vetoableChange")) {
  244.                var8 = var4.getAddListenerMethod();
  245.                var9 = new Object[]{var7};
  246.             } else {
  247.                var8 = var4.getAddListenerMethod();
  248.                var9 = new Object[]{var7};
  249.             }
  250.  
  251.             var8.invoke(var0, var9);
  252.          }
  253.       }
  254.    }
  255.  
  256.    // $FF: synthetic method
  257.    static boolean access$0(Class[] var0, Class[] var1) {
  258.       return areMethodConvertable(var0, var1);
  259.    }
  260.  
  261.    // $FF: synthetic method
  262.    static String access$1(Class var0, String var1, Class[] var2, boolean var3) {
  263.       return callToString(var0, var1, var2, var3);
  264.    }
  265. }
  266.