CLASS
在Java中,每个class都有一个相应的Class对象。也就是说,当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息
在运行期间,如果我们要产生某个类的对象,Java虚拟机(JVM)会检查该类型的Class对象是否已被加载。如果没有被加载,JVM会根据类的名称找到.class文件并加载它。一旦某个类型的Class对象已被加载到内存,就可以用它来产生该类型的所有对象
获取Class对象的三种方式:
Class<?> test1=new Test1().getClass();
//1、通过Object类的getClass()方法:(需要先实例化一个对象)
实例对象.getClass() 说明:对类进行静态初始化、非静态初始化;返回引用o运行时真正所指的对象(因为:子对象的引用可能会赋给父对象的引用变量中)所属的类的Class的对象
package reflect;
public class Getclass {
public static void main(String[] args){
Class<?> test1=new Test1().getClass();
System.out.println("test1");
}
}
class Test1{
static{
System.out.println("Perform static code block");
}
{
System.out.println("Perform dynamic code block");
}
}
输出结果:
Perform static code block
Perform dynamic code block
test1
Class<?> test2=Test2.class;
//2、通过对象实例方法获取对象:(需要先实例化一个对象)
类名.class 说明: JVM将使用类装载器, 将类装入内存(前提是:类还没有装入内存),不做类的初始化工作.返回Class的对象
package reflect;
public class ClassCreat {
public static void main(String[] args){
Class<?> test2=Test2.class;
System.out.println("test2");
}
}
class Test2{
static{
System.out.println("Perform static code block");
}
{
System.out.println("Perform dynamic code block");
}
}
输出结果:
test2
//3、类的全路径:(不许呀实例对象)
Class<?> test3=Class.forName("reflect.Test3");
Class.forName("类名字符串") (注:类名字符串是包名+类名) 说明:装入类,并做类的静态初始化,返回Class的对象
package reflect;
public class Forname {
public static void main(String[] args){
try {
Class<?> test3=Class.forName("reflect.Test3");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("test3");
}
}
class Test3{
static{
System.out.println("Perform static code block");
}
{
System.out.println("Perform dynamic code block");
}
}
输出结果:
Perform static code block
test3