Java-reflect专题
– Class类的使用方式
– 在面向对象中万物皆对象
– 除去基本数据类型 和 静态 ,但是基本数据类型有包装类,静态的东西属于类,类似于静态的常量
– 基本数据类型不是对象
– 静态的东西属于类,不是对象
– 类属于也属于对象,类对象,类属于Java.lang.Class类的实例对象
– there is a class named Class
– 现在有一个类的名字就是Class,在Java中每一个存在的类就是这个类的实例
– 方法的反射
– 成员变量的反射
– 构造函数的反射
– Java类加载机制
package reflect;
public class ClassDemo {
public static void main(String[] args) {
// Foo 的对象怎么表示
Foo foo = new Foo();
// 但是Foo() 这个类也是一个实例对象,这个类是java.lang.Class这个类的实例对象
// 如何表示表示Class类的实例对象 不能够通过new得到Class类的实例对象
// 通过java.lang.Class的源码可以看到这个类是不能够使用构造方法来创建实例对象的
// 因为源码里面的构造器是私有的,只有JVM才能够使用创建这个类的实例对象
/**
* 任何一个类都是Class的实例对象,这个实例对象有三种表现方式
*
*/
// 第一种方式--> 实际上在告诉我们任何一个类都有一个隐含的静态变量class
Class<?> class1 = Foo.class;
// 第二种方式 --> 已经知道该类的对象通过调用getClass()
Class<?> class2 = foo.getClass();
/**
* 官方说法: class1 class2表示了Foo类的类类型(class Type) 类类型 class1 class2 万事万物皆对象 累也是对象
* 是Class类的实例对象 这个对象我们称之为该类的类类型
*/
// 不管class1 还是 class2 都代表了Foo类的类类型,一个类只可能够是Class类的一个实例对象
System.out.println(class1 == class2); // true
// 第三种方式 -->
Class<?> class3 = null;
try {
// 这里Class.forName参数为当前类的全称,Foo在包reflect包当中就写reflect.Foo
// 注意这里反射的是类Foo 不是 ClassDemo
class3 = Class.forName("reflect.Foo");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
// 因为一个类只可能是Class类的一个实例对象
System.out.println(class2 == class3);
// 我们完全可以通过该类的类类型创建爱该类的对象
// 通过class1 class2 class3创建类Foo的对象,使用类类型的newInstance() 方法
// 这个class1 是谁的类类型 创建出来的就是谁的对象,在这里class1 是Foo类的类类型,创建出来的就是Foo类的对对象
try {
class1.newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Foo {
}