标签:
public String toString(Object obj) {
if (obj == null)
return"null";
if (visited.contains(obj))
return"...";
visited.add(obj);
Class<?> cl = obj.getClass();
//如果是String类型,直接返回
if (cl == String.class)
return (String) obj;
//如果是数组类型
if (cl.isArray()) {
String r = cl.getComponentType() + "[]{";//返回表示Array数组组件繁的类型
for (inti = 0; i < Array.getLength(obj); i++) {
if (i > 0)
r += ",";
Object val = Array.get(obj, i);
if (cl.getComponentType().isPrimitive())//判定Class对象是否是基本类型
r += val;
else
r += toString(val);//应用类型的话重复调用toString
}
return r + "}";
}
String r = cl.getName();
do {
r += "[";
Field[] fields = cl.getDeclaredFields();
AccessibleObject.setAccessible(fields, true);//设置域可访问
// get the names and values of all fields
for (Fieldf : fields) {
if (!Modifier.isStatic(f.getModifiers())) {
if (!r.endsWith("["))
r += ",";
r += f.getName() + "=";
try {
//获取Field的Value的标准方法
Class<?> t = f.getType();
Object val = f.get(obj);
if (t.isPrimitive())
r += val;
else
r += toString(val);
} catch (Exception e) {
e.printStackTrace();
}
}
}
r += "]";
cl = cl.getSuperclass();//还要遍历其超类
} while (cl != null);
return r;
}
3、使用Method对象来实现C语言中的函数指针的所有操作。
4、继承中的反射
{
}
{
}
public static void main(String[] args) {
Am a = new Bm();
System.out.println(a.getClass()); //输出结果为class test.Bm,即运行时类型为Bm
}
}
4、RTTI:(Run-Time Type Information,通过运行时类型信息)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。
例:FancyToy.class ,相较于forName()方法更安全,因为其在编译时就会受到检查(故而不用像forName()一样置于try语句中);
1.类字面常量同时可以应用于接口、数组、以及基本数据类型中;如boolean.class = Boolean.TYPE
2.使用类字面常量时,不会自动初始化该Class对象,而是执行了加载、链接、初始化三个准备步骤;初始化被延迟到首次引用静态方法(构造器也是静态的)或非常数静态域(调用常数并不会对类进行初始化)时才执行;
而相对应的使用Class.forName()立即就进行了初始化。
6、泛型的Class引用
1.引入泛型,对Class引用所指向的Class对象的类型进行限定
Class<Integer> class1 = int.class;
//int a;
//class1 = a.getClass();//基本类型不能存在getClass函数
Integer mInteger = null;
class1 = (Class<Integer>) mInteger.getClass();//getClass要注意加上强制转换
//Double mDouble;
//class1 = mDouble.getClass();//无法编译通过
//class1 = double.class;//类型不匹配,无法编译通过
2.Class<?>优于平凡的Class,即是它们其实是等价的
3.使用通配符?创建一个范围:
Class<? extends Number> class2 = int.class;
Class<? super Integer> class1 = int.class;
4.创建对象使用class1.newInstance();
5.使用泛型和平凡Class,创建对象的区别;泛型会返回该对象的确切类型,而Class只能返回基本的Object
Classclass1 = int.class;
intm = (int) class1.newInstance();
Class<Integer> class2 = int.class;
intp = class2.newInstance();
intm = 0;
Class<Integer> class1 = int.class;
class1.isInstance(m);
标签:
原文地址:http://blog.csdn.net/woliuyunyicai/article/details/44856361