RTTI: run-time type identification
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/* Class对象的生成方式如下:
* 1) Class.forName("类名字符串") (注意:类名字符串必须是全称,包名+类名)
* 2) 类名.class
* 3) 实例对象.getClass()
*/
/*
* (节选自 http://blog.sina.com.cn/s/blog_4c1c2d43010007fx.html)
* 每一个类都有一个Class对象,每当编译一个新类,就会产生一个Class对象(保存在一个同名的.class文件中)
* 在运行时,当我们想生成这个类的对象时,运行这个程序的JVM首先检查这个类的Class对象是否已经加载,
* 如果尚未加载,JVM就会根据类名查找.class文件,并将其载入,
* 所以Java程序并不是一开始执行就被完全加载的,这一点与许多传统语言都不同的.
* 一旦某个类的Class对象被载入内存,它就被用来创建这个类的所有对象
*
*/
class MyClass {
// 构造函数
MyClass() {
System.out.println("MyClass--构造函数");
}
public void myMethod() {
System.out.println("MyClass--myMethod()");
}
//静态成员初始化
static{
System.out.println("MyClass--静态成员初始化");
}
//非静态成员初始化
{
System.out.println("MyClass--非静态成员初始化");
}
}
public class HelloWorld {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
System.out.println(MyClass.class instanceof Class); // true
System.out.println("--------------");
// 然而在打印这行分隔符时,class MyClass仍未进行静态成员初始化
// 说明此时class MyClass还未被完全加载进来
Class ClassMyClass = Class.forName("MyClass");
// 根据打印结果,class MyClass做了静态成员初始化
System.out.println("--------------");
System.out.println(ClassMyClass);
System.out.println(ClassMyClass instanceof Class); // true
System.out.println(ClassMyClass instanceof Object); // true
System.out.println("--------------");
ClassMyClass.newInstance();
MyClass myClass = new MyClass();
// Method用法具体可参考 http://blog.csdn.net/cuiran/article/details/5302074
Method MethodmyMethod = ClassMyClass.getMethod("myMethod", null);
MethodmyMethod.invoke(myClass, null);
System.out.println("--------------");
//MyClass myClass = new MyClass();
// MyClass.class -- 即"类名.class"
// myClass.getClass() -- 即"该类的一个对象.getClass()"
// Class.forName("MyClass") -- 即"Class.forName(类名字符串)"
// 返回的结果都是Class类(class Class)的对象
System.out.println(MyClass.class instanceof Class); // true
System.out.println(myClass.getClass() instanceof Class); // true
System.out.println(Class.forName("MyClass") instanceof Class); // true
// 并且三者相等
System.out.println(myClass.getClass() == MyClass.class); // true
System.out.println(Class.forName("MyClass") == MyClass.class); // true
// 仅仅类名的话,啥也不是
//System.out.println(MyClass);
System.out.println("quit");
}
}
4540

被折叠的 条评论
为什么被折叠?



