package com.jarvis.cache.reflect.generics;
import java.lang.reflect.MalformedParameterizedTypeException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.util.Arrays;
/**
* 代码拷贝来自:sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
* @author jiayu.qiu
*/
public class ParameterizedTypeImpl implements ParameterizedType {
private Type[] actualTypeArguments;
private Class<?> rawType;
private Type ownerType;
private ParameterizedTypeImpl(Class<?> paramClass, Type[] paramArrayOfType, Type paramType) {
this.actualTypeArguments=paramArrayOfType;
this.rawType=paramClass;
if(paramType != null)
this.ownerType=paramType;
else
this.ownerType=paramClass.getDeclaringClass();
validateConstructorArguments();
}
private void validateConstructorArguments() {
@SuppressWarnings("rawtypes")
TypeVariable[] arrayOfTypeVariable=this.rawType.getTypeParameters();
if(arrayOfTypeVariable.length != this.actualTypeArguments.length) {
throw new MalformedParameterizedTypeException();
}
for(int i=0; i < this.actualTypeArguments.length; i++);
}
public static ParameterizedTypeImpl make(Class<?> paramClass, Type[] paramArrayOfType, Type paramType) {
return new ParameterizedTypeImpl(paramClass, paramArrayOfType, paramType);
}
public Type[] getActualTypeArguments() {
return (Type[])this.actualTypeArguments.clone();
}
public Class<?> getRawType() {
return this.rawType;
}
public Type getOwnerType() {
return this.ownerType;
}
public boolean equals(Object paramObject) {
if((paramObject instanceof ParameterizedType)) {
ParameterizedType localParameterizedType=(ParameterizedType)paramObject;
if(this == localParameterizedType) {
return true;
}
Type localType1=localParameterizedType.getOwnerType();
Type localType2=localParameterizedType.getRawType();
return (this.ownerType == null ? localType1 == null : this.ownerType.equals(localType1)) && (this.rawType == null ? localType2 == null : this.rawType.equals(localType2))
&& (Arrays.equals(this.actualTypeArguments, localParameterizedType.getActualTypeArguments()));
}
return false;
}
public int hashCode() {
return Arrays.hashCode(this.actualTypeArguments) ^ (this.ownerType == null ? 0 : this.ownerType.hashCode()) ^ (this.rawType == null ? 0 : this.rawType.hashCode());
}
public String toString() {
StringBuilder localStringBuilder=new StringBuilder();
if(this.ownerType != null) {
if((this.ownerType instanceof Class<?>))
localStringBuilder.append(((Class<?>)this.ownerType).getName());
else {
localStringBuilder.append(this.ownerType.toString());
}
localStringBuilder.append(".");
if((this.ownerType instanceof ParameterizedTypeImpl)) {
localStringBuilder.append(this.rawType.getName().replace(((ParameterizedTypeImpl)this.ownerType).rawType.getName() + "$", ""));
} else
localStringBuilder.append(this.rawType.getName());
} else {
localStringBuilder.append(this.rawType.getName());
}
if((this.actualTypeArguments != null) && (this.actualTypeArguments.length > 0)) {
localStringBuilder.append("<");
int i=1;
for(Type localType: this.actualTypeArguments) {
if(i == 0)
localStringBuilder.append(", ");
if((localType instanceof Class<?>))
localStringBuilder.append(((Class<?>)localType).getName());
else {
// if(null!=localType){
localStringBuilder.append(localType.toString());
// }
}
i=0;
}
localStringBuilder.append(">");
}
return localStringBuilder.toString();
}
}