JavaClass.java revision b9e4aa96812692a7dcf468445e64bc5b30d3c79a
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 isVoid() {
129        return void.class.equals(mClass);
130    }
131
132    @Override
133    public ModelClass unbox() {
134        if (mClass.isPrimitive()) {
135            return this;
136        }
137        if (Integer.class.equals(mClass)) {
138            return new JavaClass(int.class);
139        } else if (Long.class.equals(mClass)) {
140            return new JavaClass(long.class);
141        } else if (Short.class.equals(mClass)) {
142            return new JavaClass(short.class);
143        } else if (Byte.class.equals(mClass)) {
144            return new JavaClass(byte.class);
145        } else if (Character.class.equals(mClass)) {
146            return new JavaClass(char.class);
147        } else if (Double.class.equals(mClass)) {
148            return new JavaClass(double.class);
149        } else if (Float.class.equals(mClass)) {
150            return new JavaClass(float.class);
151        } else if (Boolean.class.equals(mClass)) {
152            return new JavaClass(boolean.class);
153        } else {
154            // not a boxed type
155            return this;
156        }
157
158    }
159
160    @Override
161    public JavaClass box() {
162        if (!mClass.isPrimitive()) {
163            return this;
164        }
165        if (int.class.equals(mClass)) {
166            return new JavaClass(Integer.class);
167        } else if (long.class.equals(mClass)) {
168            return new JavaClass(Long.class);
169        } else if (short.class.equals(mClass)) {
170            return new JavaClass(Short.class);
171        } else if (byte.class.equals(mClass)) {
172            return new JavaClass(Byte.class);
173        } else if (char.class.equals(mClass)) {
174            return new JavaClass(Character.class);
175        } else if (double.class.equals(mClass)) {
176            return new JavaClass(Double.class);
177        } else if (float.class.equals(mClass)) {
178            return new JavaClass(Float.class);
179        } else if (boolean.class.equals(mClass)) {
180            return new JavaClass(Boolean.class);
181        } else {
182            // not a valid type?
183            return this;
184        }
185    }
186
187    @Override
188    public boolean isAssignableFrom(ModelClass that) {
189        Class thatClass = ((JavaClass) that).mClass;
190        return mClass.isAssignableFrom(thatClass);
191    }
192
193    @Override
194    public ModelClass getSuperclass() {
195        if (mClass.getSuperclass() == null) {
196            return null;
197        }
198        return new JavaClass(mClass.getSuperclass());
199    }
200
201    @Override
202    public String getCanonicalName() {
203        return mClass.getCanonicalName();
204    }
205
206    @Override
207    public ModelClass erasure() {
208        return this;
209    }
210
211    @Override
212    public String getJniDescription() {
213        return TypeUtil.getInstance().getDescription(this);
214    }
215
216    @Override
217    protected ModelField[] getDeclaredFields() {
218        Field[] fields = mClass.getDeclaredFields();
219        ModelField[] modelFields;
220        if (fields == null) {
221            modelFields = new ModelField[0];
222        } else {
223            modelFields = new ModelField[fields.length];
224            for (int i = 0; i < fields.length; i++) {
225                modelFields[i] = new JavaField(fields[i]);
226            }
227        }
228        return modelFields;
229    }
230
231    @Override
232    protected ModelMethod[] getDeclaredMethods() {
233        Method[] methods = mClass.getDeclaredMethods();
234        if (methods == null) {
235            return new ModelMethod[0];
236        } else {
237            ModelMethod[] classMethods = new ModelMethod[methods.length];
238            for (int i = 0; i < methods.length; i++) {
239                classMethods[i] = new JavaMethod(methods[i]);
240            }
241            return classMethods;
242        }
243    }
244
245    @Override
246    public boolean equals(Object obj) {
247        if (obj instanceof JavaClass) {
248            return mClass.equals(((JavaClass) obj).mClass);
249        } else {
250            return false;
251        }
252    }
253
254    @Override
255    public int hashCode() {
256        return mClass.hashCode();
257    }
258}
259