hitsmaxft
2015-06-30 22:32:36 +08:00
一般写代码是这样的 this.getClasss()
运行时是这样的
ALOAD 0
INVOKEVIRTUAL java/lang/Object.getClass ()Ljava/lang/Class;
(因为 getClass 方法是从 Object 继承来的)
编译的时候, javac 会自动帮你类型信息补充上, 所以说 java 是静态类型, 写的时候已经决定了类型信息。
但是如果希望动态地在类型本身做一些操作,比如根据传入实例的具体类型, 调用指定的方法之类的。
这时候就需要借助 reflection 系列包
在java 中 ClassA 本身也是个类型, 通过加载器保证单例(所以。。。),ClassA.class 可以认为是 ClassA 类型在内存的单例。
这个留给程序员的后门,就是通过字符串。 你写在代码里的是字符串, javac 会编译成 jvm 认得的类信息,而当人肉地通过反射告诉 jvm 的时候, 也是通过字符串, 所以你就看到用字符串查找 class,用字符串查找方法等等。
总之, 你理解为你用反射其实就是人肉地在运行时干 javac 干的事情。
在 java 里面,几乎都是以对象在处理事情。 所以使用反射的时候, 就是通过反射查找一个具体的类型或者具体的方法“的实例”, 然后调用这个实例的接口,来完成模拟 jvm 的行为。
我不知道为什么叫做反射, 但是你可以认为用代码来描述代码, 或者看起来还像是照妖镜下的代码。