欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > > 文章正文

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

来源: javaer 分享于  点击 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();
}

相关文章

    暂无相关文章

用户点评