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();}
阅读全文
0 0
- java反射系列02 toString() toGenericString()
- java反射覆盖toString()方法
- java反射实现的通用toString
- 使用Java反射机制覆盖toString()方法
- java系列-反射机制
- java学习系列----反射
- Java系列---反射
- 利用java反射机制编写通用的toString 方法
- 使用java反射编写通用的toString()方法
- java中反射系列一
- java夯实基础系列:反射
- Java反射系列之Field
- JAVA反射系列之Field
- Java.toString()
- java.toString
- Java toString
- java--toString
- Java toString
- PHP5中的this,self和parent关键字详解
- Redis主从复制的实现
- 文件定位函数 fseek
- tensorflow:Multiple GPUs
- Kubernetes服务之“运行单实例的有状态服务”
- java反射系列02 toString() toGenericString()
- JSON 入门指南
- 清华科技大讲堂(第4季) 企业商务与IT如何应对新时代的竞争大潮,实现数字化转型与创新
- 最新版windows 2012R2、Apache24、mod_wsgi、Django1.9、python3.4项目部署(生产环境)
- 剑指offer——扑克牌顺子
- react-redux初探1
- angularJs的理解之two
- Android网络API(android.net.http):概览
- C++ STL 一般总结