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
74
75
76
77
78
79
80
81 return true;
82 }
83 }