JavaClass.java revision 91d538470c011e19fa4375cc3531b5dd9ae01d55
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; 23 24public class JavaClass extends ModelClass { 25 public final Class mClass; 26 27 public JavaClass(Class clazz) { 28 mClass = clazz; 29 } 30 31 @Override 32 public String toJavaCode() { 33 return toJavaCode(mClass); 34 } 35 36 private static String toJavaCode(Class aClass) { 37 if (aClass.isArray()) { 38 Class component = aClass.getComponentType(); 39 return toJavaCode(component) + "[]"; 40 } else { 41 return aClass.getCanonicalName().replace('$', '.'); 42 } 43 } 44 45 @Override 46 public boolean isArray() { 47 return mClass.isArray(); 48 } 49 50 @Override 51 public ModelClass getComponentType() { 52 if (mClass.isArray()) { 53 return new JavaClass(mClass.getComponentType()); 54 } else if (isList() || isMap()) { 55 return new JavaClass(Object.class); 56 } else { 57 return null; 58 } 59 } 60 61 @Override 62 public boolean isNullable() { 63 return Object.class.isAssignableFrom(mClass); 64 } 65 66 @Override 67 public boolean isPrimitive() { 68 return mClass.isPrimitive(); 69 } 70 71 @Override 72 public boolean isBoolean() { 73 return boolean.class.equals(mClass); 74 } 75 76 @Override 77 public boolean isChar() { 78 return char.class.equals(mClass); 79 } 80 81 @Override 82 public boolean isByte() { 83 return byte.class.equals(mClass); 84 } 85 86 @Override 87 public boolean isShort() { 88 return short.class.equals(mClass); 89 } 90 91 @Override 92 public boolean isInt() { 93 return int.class.equals(mClass); 94 } 95 96 @Override 97 public boolean isLong() { 98 return long.class.equals(mClass); 99 } 100 101 @Override 102 public boolean isFloat() { 103 return float.class.equals(mClass); 104 } 105 106 @Override 107 public boolean isDouble() { 108 return double.class.equals(mClass); 109 } 110 111 @Override 112 public boolean isGeneric() { 113 return false; 114 } 115 116 @Override 117 public boolean isVoid() { 118 return void.class.equals(mClass); 119 } 120 121 @Override 122 public ModelClass unbox() { 123 if (mClass.isPrimitive()) { 124 return this; 125 } 126 if (Integer.class.equals(mClass)) { 127 return new JavaClass(int.class); 128 } else if (Long.class.equals(mClass)) { 129 return new JavaClass(long.class); 130 } else if (Short.class.equals(mClass)) { 131 return new JavaClass(short.class); 132 } else if (Byte.class.equals(mClass)) { 133 return new JavaClass(byte.class); 134 } else if (Character.class.equals(mClass)) { 135 return new JavaClass(char.class); 136 } else if (Double.class.equals(mClass)) { 137 return new JavaClass(double.class); 138 } else if (Float.class.equals(mClass)) { 139 return new JavaClass(float.class); 140 } else if (Boolean.class.equals(mClass)) { 141 return new JavaClass(boolean.class); 142 } else { 143 // not a boxed type 144 return this; 145 } 146 147 } 148 149 @Override 150 public JavaClass box() { 151 if (!mClass.isPrimitive()) { 152 return this; 153 } 154 if (int.class.equals(mClass)) { 155 return new JavaClass(Integer.class); 156 } else if (long.class.equals(mClass)) { 157 return new JavaClass(Long.class); 158 } else if (short.class.equals(mClass)) { 159 return new JavaClass(Short.class); 160 } else if (byte.class.equals(mClass)) { 161 return new JavaClass(Byte.class); 162 } else if (char.class.equals(mClass)) { 163 return new JavaClass(Character.class); 164 } else if (double.class.equals(mClass)) { 165 return new JavaClass(Double.class); 166 } else if (float.class.equals(mClass)) { 167 return new JavaClass(Float.class); 168 } else if (boolean.class.equals(mClass)) { 169 return new JavaClass(Boolean.class); 170 } else { 171 // not a valid type? 172 return this; 173 } 174 } 175 176 @Override 177 public boolean isAssignableFrom(ModelClass that) { 178 Class thatClass = ((JavaClass) that).mClass; 179 return mClass.isAssignableFrom(thatClass); 180 } 181 182 @Override 183 public ModelClass getSuperclass() { 184 if (mClass.getSuperclass() == null) { 185 return null; 186 } 187 return new JavaClass(mClass.getSuperclass()); 188 } 189 190 @Override 191 public String getCanonicalName() { 192 return mClass.getCanonicalName(); 193 } 194 195 @Override 196 public ModelClass erasure() { 197 return this; 198 } 199 200 @Override 201 public String getJniDescription() { 202 return TypeUtil.getInstance().getDescription(this); 203 } 204 205 @Override 206 protected ModelField[] getDeclaredFields() { 207 Field[] fields = mClass.getDeclaredFields(); 208 ModelField[] modelFields; 209 if (fields == null) { 210 modelFields = new ModelField[0]; 211 } else { 212 modelFields = new ModelField[fields.length]; 213 for (int i = 0; i < fields.length; i++) { 214 modelFields[i] = new JavaField(fields[i]); 215 } 216 } 217 return modelFields; 218 } 219 220 @Override 221 protected ModelMethod[] getDeclaredMethods() { 222 Method[] methods = mClass.getDeclaredMethods(); 223 if (methods == null) { 224 return new ModelMethod[0]; 225 } else { 226 ModelMethod[] classMethods = new ModelMethod[methods.length]; 227 for (int i = 0; i < methods.length; i++) { 228 classMethods[i] = new JavaMethod(methods[i]); 229 } 230 return classMethods; 231 } 232 } 233 234 @Override 235 public boolean equals(Object obj) { 236 if (obj instanceof JavaClass) { 237 return mClass.equals(((JavaClass) obj).mClass); 238 } else { 239 return false; 240 } 241 } 242 243 @Override 244 public int hashCode() { 245 return mClass.hashCode(); 246 } 247} 248