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