View Javadoc

1   package net.skirnir.freyja;
2   
3   import java.lang.reflect.Array;
4   import java.lang.reflect.Modifier;
5   
6   
7   public class VariableResolverUtils
8   {
9       private VariableResolverUtils()
10      {
11      }
12  
13  
14      /***
15       * 指定されたオブジェクトの型を表すClassオブジェクトを返します。
16       * <p>プリミティブ型のラッパクラスのインスタンスの場合はプリミティブ型を表すClassオブジェクトを返します。
17       * </p>
18       *
19       * @param obj オブジェクト。nullを指定することもできます。
20       * @return 型を表すClassオブジェクト。nullが返されることはありません。
21       */
22      public static Class toType(Object obj)
23      {
24          if (obj == null) {
25              return Object.class;
26          }
27          Class clazz = obj.getClass();
28          if (clazz.isArray()) {
29              Class type = clazz.getComponentType();
30              if (type.isPrimitive()) {
31                  return clazz;
32              } else {
33                  return Array.newInstance(toType(type), 0).getClass();
34              }
35          } else if (clazz.isPrimitive()) {
36              return clazz;
37          } else if (clazz == Byte.class) {
38              return Byte.TYPE;
39          } else if (clazz == Short.class) {
40              return Short.TYPE;
41          } else if (clazz == Integer.class) {
42              return Integer.TYPE;
43          } else if (clazz == Long.class) {
44              return Long.TYPE;
45          } else if (clazz == Float.class) {
46              return Float.TYPE;
47          } else if (clazz == Double.class) {
48              return Double.TYPE;
49          } else if (clazz == Character.class) {
50              return Character.TYPE;
51          } else if (clazz == Boolean.class) {
52              return Boolean.TYPE;
53          } else if (isVisible(clazz)) {
54              return clazz;
55          } else {
56              // クラスが見えない場合は見えるインタフェースを返す。
57              Class[] interfaces = clazz.getInterfaces();
58              for (int i = 0; i < interfaces.length; i++) {
59                  if (isVisible(interfaces[i])) {
60                      return interfaces[i];
61                  }
62              }
63          }
64          return Object.class;
65      }
66  
67  
68      static boolean isVisible(Class clazz)
69      {
70          if (!Modifier.isPublic(clazz.getModifiers())) {
71              return false;
72          }
73          // TODO 20060929 多分不要。manageプラグインを開発モードで動かして問題が出たら考えよう。
74          //        try {
75          //            Class.forName(clazz.getName(), true, Thread.currentThread()
76          //                .getContextClassLoader());
77          //            return true;
78          //        } catch (ClassNotFoundException ex) {
79          //            return false;
80          //        }
81          return true;
82      }
83  }