获取Class对象有三种方式

    1. 类名.Class();

     2. 对象.getClass();

     3. Class.forName("类全名");


看下例子:

    

package com.action;

public class TestClass {
	public static void main(String[] args) throws ClassNotFoundException {
		// 类加载的三种方式 
		// 1. 类名加载
		Class<Student> st1 = com.action.Student.class;
		// 2. 对象加载
		Class<? extends Student> st2 = new Student().getClass();
		// 3. Class.forName()加载
		Class<?> st3 = Class.forName("com.action.Student");
		System.out.println(st1);
		System.out.println(st2);
		System.out.println(st3);
	}
}

运行结果:  class com.action.Student
            class com.action.Student
            class com.action.Student

为了区分类三种类加载方式的不同,用下面的例子看看

1.类名.Class();

package com.action;

public class TestClass {
	public static <T> void main(String[] args) throws ClassNotFoundException {
		// 类加载的三种方式 
		// 1. 类名加载
		Class<Studen> st1 = Studen.class;
		System.out.println(st1);
	}
}
class Studen{
	{
		System.out.println("我是动态代码块----!");
	}
	static {
		System.out.println("我是静态代码块----!");
	}
}

输出结果:class com.action.Studen

说明,通过类名.Class();不执行 静态代码块和动态代码块

2.对象.getClass();

package com.action;

public class TestClass {
	public static <T> void main(String[] args) throws ClassNotFoundException {
		// 2. 对象.getClass();
		Class st2 = new Studen().getClass();
		
	}
}
class Studen{
	{
		System.out.println("我是动态代码块----!");
	}
	static {
		System.out.println("我是静态代码块----!");
	}
}

结果:我是动态代码块----!
      我是静态代码块----!

通过对象.getClass();  执行 静态代码块和动态代码块

3.Class.forName("类全名");

package com.action;

public class TestClass {
	public static <T> void main(String[] args) throws ClassNotFoundException {
		// 2.Class.forName("类全名");
		Class st3 = Class.forName("com.action.Studen");
	}
}
class Studen{
	{
		System.out.println("我是动态代码块----!");
	}
	static {
		System.out.println("我是静态代码块----!");
	}
}

结果:我是静态代码块----!

说明:Class.forName("类全名")  执行静态代码块,不执行动态代码块。


不足之处,多多指导!