标签:
编程思想这个专栏停了好久了,主要是把精力放在了其他知识上,现在继续补上。
前面两篇写到RTTI和简单的反射介绍,先回顾一下:
RTTI,运行时类型信息,多态的应用,类型转换其实是发生在运行期间。
Class对象:
编程思想讲到的定义,Java使用Class对象来执行其RTTI,类是程序的一部分,每个类都有一个Class对象,其实每编写和编译一个新类,就会产生一个Class对象,其实这个对象时被保存在同名的.class文件中的。生成这个类对象,其实是JVM(Java虚拟机)使用了“类加载器”的子系统。
补充一下百度的定义:
在Java中,每个class都有一个相应的Class对象。也就是说,当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息。最后一句是重点。
而class是一个类名的标志,class A,A是一个类,而Class是一个对象。
是不是很模糊,这些概念,Class哪里冒出来,事实上还有一个ClassLoader。为了搞清楚关系,这种肯定是虚拟机方面的除了《深入理解JVM》,特定去问了RednaxelaFX大哥还有什么书籍比较好。他推荐了《Inside the Java Virtual Machine》。看了五章之后,大体有个方向,这本书也推荐其他人,不是太难懂,在我大二的时候看一本红色封面的JVM的书看得真心蛋疼,一来就是代码直接转汇编,所以说,合适的时候看合适的书是很重要的。
《Inside the Java Virtual Machine》一书笔记:
先把握整个体系结构的4个技术:
public class TestClass { public static void main(String[] args) { Class c = Object.class.getClass(); Class c1 = Object.class; Object o = new Object(); Class oc = o.getClass(); Class ct = null; try { ct = Class.forName("java.lang.Object"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } TestClass t = new TestClass(); Class tclass = t.getClass(); System.out.println(tclass.getClassLoader()); System.out.println(c.getClassLoader()); System.out.println(oc.getClassLoader()); System.out.println(ct.getClassLoader()); System.out.println(c1.getClassLoader()); System.out.println(tclass.getName()); System.out.println(c.getName()); System.out.println(oc.getName()); System.out.println(ct.getName()); System.out.println(c1.getName()); } } output: sun.misc.Launcher$AppClassLoader@da4a1c9 null null null null TestClass java.lang.Class java.lang.Object java.lang.Object java.lang.Object
标签:
原文地址:http://blog.csdn.net/iaiti/article/details/42557581