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

来源:互联网 发布:淘宝上的摩托车靠谱吗 编辑:程序博客网 时间:2024/06/10 18:23

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 blocke.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


0 0
原创粉丝点击