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