JavaClass.java revision bd42d20f70b1f88e27e3b3c9c3a9c55ec155d128
1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *      http://www.apache.org/licenses/LICENSE-2.0
7 * Unless required by applicable law or agreed to in writing, software
8 * distributed under the License is distributed on an "AS IS" BASIS,
9 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10 * See the License for the specific language governing permissions and
11 * limitations under the License.
12 */
13
14package android.databinding.tool.reflection.java;
15
16import android.databinding.tool.reflection.ModelClass;
17import android.databinding.tool.reflection.ModelField;
18import android.databinding.tool.reflection.ModelMethod;
19import android.databinding.tool.reflection.TypeUtil;
20
21import java.lang.reflect.Field;
22import java.lang.reflect.Method;
23import java.util.List;
24
25public class JavaClass extends ModelClass {
26    public final Class mClass;
27
28    public JavaClass(Class clazz) {
29        mClass = clazz;
30    }
31
32    @Override
33    public String toJavaCode() {
34        return toJavaCode(mClass);
35    }
36
37    private static String toJavaCode(Class aClass) {
38        if (aClass.isArray()) {
39            Class component = aClass.getComponentType();
40            return toJavaCode(component) + "[]";
41        } else {
42            return aClass.getCanonicalName().replace('$', '.');
43        }
44    }
45
46    @Override
47    public boolean isArray() {
48        return mClass.isArray();
49    }
50
51    @Override
52    public ModelClass getComponentType() {
53        if (mClass.isArray()) {
54            return new JavaClass(mClass.getComponentType());
55        } else if (isList() || isMap()) {
56            return new JavaClass(Object.class);
57        } else {
58            return null;
59        }
60    }
61
62    @Override
63    public boolean isNullable() {
64        return Object.class.isAssignableFrom(mClass);
65    }
66
67    @Override
68    public boolean isPrimitive() {
69        return mClass.isPrimitive();
70    }
71
72    @Override
73    public boolean isBoolean() {
74        return boolean.class.equals(mClass);
75    }
76
77    @Override
78    public boolean isChar() {
79        return char.class.equals(mClass);
80    }
81
82    @Override
83    public boolean isByte() {
84        return byte.class.equals(mClass);
85    }
86
87    @Override
88    public boolean isShort() {
89        return short.class.equals(mClass);
90    }
91
92    @Override
93    public boolean isInt() {
94        return int.class.equals(mClass);
95    }
96
97    @Override
98    public boolean isLong() {
99        return long.class.equals(mClass);
100    }
101
102    @Override
103    public boolean isFloat() {
104        return float.class.equals(mClass);
105    }
106
107    @Override
108    public boolean isDouble() {
109        return double.class.equals(mClass);
110    }
111
112    @Override
113    public boolean isGeneric() {
114        return false;
115    }
116
117    @Override
118    public List<ModelClass> getTypeArguments() {
119        return null;
120    }
121
122    @Override
123    public boolean isTypeVar() {
124        return false;
125    }
126
127    @Override
128    public boolean isWildcard() {
129        return false;
130    }
131
132    @Override
133    public boolean isInterface() {
134        return mClass.isInterface();
135    }
136
137    @Override
138    public boolean isVoid() {
139        return void.class.equals(mClass);
140    }
141
142    @Override
143    public ModelClass unbox() {
144        if (mClass.isPrimitive()) {
145            return this;
146        }
147        if (Integer.class.equals(mClass)) {
148            return new JavaClass(int.class);
149        } else if (Long.class.equals(mClass)) {
150            return new JavaClass(long.class);
151        } else if (Short.class.equals(mClass)) {
152            return new JavaClass(short.class);
153        } else if (Byte.class.equals(mClass)) {
154            return new JavaClass(byte.class);
155        } else if (Character.class.equals(mClass)) {
156            return new JavaClass(char.class);
157        } else if (Double.class.equals(mClass)) {
158            return new JavaClass(double.class);
159        } else if (Float.class.equals(mClass)) {
160            return new JavaClass(float.class);
161        } else if (Boolean.class.equals(mClass)) {
162            return new JavaClass(boolean.class);
163        } else {
164            // not a boxed type
165            return this;
166        }
167
168    }
169
170    @Override
171    public JavaClass box() {
172        if (!mClass.isPrimitive()) {
173            return this;
174        }
175        if (int.class.equals(mClass)) {
176            return new JavaClass(Integer.class);
177        } else if (long.class.equals(mClass)) {
178            return new JavaClass(Long.class);
179        } else if (short.class.equals(mClass)) {
180            return new JavaClass(Short.class);
181        } else if (byte.class.equals(mClass)) {
182            return new JavaClass(Byte.class);
183        } else if (char.class.equals(mClass)) {
184            return new JavaClass(Character.class);
185        } else if (double.class.equals(mClass)) {
186            return new JavaClass(Double.class);
187        } else if (float.class.equals(mClass)) {
188            return new JavaClass(Float.class);
189        } else if (boolean.class.equals(mClass)) {
190            return new JavaClass(Boolean.class);
191        } else {
192            // not a valid type?
193            return this;
194        }
195    }
196
197    @Override
198    public boolean isAssignableFrom(ModelClass that) {
199        Class thatClass = ((JavaClass) that).mClass;
200        return mClass.isAssignableFrom(thatClass);
201    }
202
203    @Override
204    public ModelClass getSuperclass() {
205        if (mClass.getSuperclass() == null) {
206            return null;
207        }
208        return new JavaClass(mClass.getSuperclass());
209    }
210
211    @Override
212    public String getCanonicalName() {
213        return mClass.getCanonicalName();
214    }
215
216    @Override
217    public ModelClass erasure() {
218        return this;
219    }
220
221    @Override
222    public String getJniDescription() {
223        return TypeUtil.getInstance().getDescription(this);
224    }
225
226    @Override
227    protected ModelField[] getDeclaredFields() {
228        Field[] fields = mClass.getDeclaredFields();
229        ModelField[] modelFields;
230        if (fields == null) {
231            modelFields = new ModelField[0];
232        } else {
233            modelFields = new ModelField[fields.length];
234            for (int i = 0; i < fields.length; i++) {
235                modelFields[i] = new JavaField(fields[i]);
236            }
237        }
238        return modelFields;
239    }
240
241    @Override
242    protected ModelMethod[] getDeclaredMethods() {
243        Method[] methods = mClass.getDeclaredMethods();
244        if (methods == null) {
245            return new ModelMethod[0];
246        } else {
247            ModelMethod[] classMethods = new ModelMethod[methods.length];
248            for (int i = 0; i < methods.length; i++) {
249                classMethods[i] = new JavaMethod(methods[i]);
250            }
251            return classMethods;
252        }
253    }
254
255    @Override
256    public boolean equals(Object obj) {
257        if (obj instanceof JavaClass) {
258            return mClass.equals(((JavaClass) obj).mClass);
259        } else {
260            return false;
261        }
262    }
263
264    @Override
265    public int hashCode() {
266        return mClass.hashCode();
267    }
268}
269