java反射系列02 toString() toGenericString(),
分享于 点击 17729 次 点评:97
java反射系列02 toString() toGenericString(),
前言
由Class类文档和Class.toString()的方法文档我们可得知toString()方法的实现思路
- Interface, Annotation -> “interface”
- primitive(八种基本类型,void) -> “”
- 其他的非接口,非原始类型的类 -> “class”
加一个空格(” “)。
加 getName()方法返回的字符串。
代码
那么Class.toString()方法的代码实现就出来了:
public String toString(){
return (isInterface() ? "interface" : isPrimitive() ? "" : "class") + getName()
注:isInterface()判断是否为接口 如果是接口或注解返回true
isPrimitive()判断是否为原始类型,如果是八种基本类型或void返回ture
toGenericString()源码分析
public String toGenericString() {
if (clz.isPrimitive()) { //如果是原始类型,直接调用toString()方法
return toString();
} else {
StringBuilder sb = new StringBuilder();
//权限修饰符
int mod = clz.getModifiers() & Modifier.classModifiers();
if (mod > 0) {
sb.append(Modifier.toString(mod));
sb.append(' ');
}
//如果是注解,添加一个@
if (clz.isAnnotation()) {
sb.append('@');
}
//判断是接口,枚举,还是类
if (clz.isInterface()) {
sb.append("interface");
} else if (clz.isEnum()) {
sb.append("enum");
} else {
sb.append("class");
}
//添加qualified name
sb.append(' ').append(clz.getName());
//如果有,添加泛型类型参数
TypeVariable<? extends Class<?>>[] typeParams = clz.getTypeParameters();
if (typeParams.length > 0) {
sb.append('<');
boolean first = true;
for (TypeVariable<? extends Class<?>> typeParam : typeParams) {
if (!first) {
sb.append(',').append(' ');
}
sb.append(typeParam.getTypeName());
first = false;
}
sb.append('>');
}
return sb.toString();
}
}
注:isAnnotation() 判断是否为注解类
isEnum()判断是否为枚举类
意外的发现
在调用以下代码时
Iterator.class.toGenericString();
本以为返回的是public interface java.util.Iterator<E>
但是返回的却是 public abstract interface java.util.Iterator<E>
有一点小惊讶,后来仔细回想,接口本来就是抽象的吗,只是我们声明的时候习惯性的把abstract省略了,以下声明是最繁琐的一种形式
public abstract interface A {
public abstract void a();
}
通常我们都会把其简写为
public interface A {
void a();
}
相关文章
- 暂无相关文章
用户点评