java反射系列02 toString() toGenericString()

来源:互联网 发布:网络作家的故事 编辑:程序博客网 时间:2024/06/10 02:24

前言

由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();}
原创粉丝点击