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