JAVA反射(一):获取Class对象的三种方式及其区别

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
 

发布了13 篇原创文章 · 获赞 0 · 访问量 2735

猜你喜欢

转载自blog.csdn.net/lq851643368/article/details/53556358