反射.class、class.forname() 和 getClass() 的区别

反射

概念

Java的反射机制在运行的状态,对于任何一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能被称为java语言的反射机制。
可以理解为在运行时期获得对象类型信息的操作。传统的编程方法要求程序员在编译阶段决定使用哪些类型,但是在反射的帮助下,编程人员可以动态获取这些信息,从而编写更加具有可移植性的代码。

运行流程

每个java程序执行必须经过 编译、加载、连接和初始化四个阶段
1.编译:将.java文件编译成字节码.class文件
2.加载:查找并加载类的二进制数据
3.连接:
a验证:确保被加载类的正确性
b准备:为类的静态变量分配内存,并将其初始化为默认值
c解析:将类中的符号转换为直接引用
4.初始化:为类的静态变量赋予正确的初始值

1.加载是指将编译的字节码文件中的二进制读入内存,并将其放在运行时数据区的方法区,然后栈的对象的引用到堆中创建一个java.lang.class对象并指向;该java.lang.class对象是单例的,无论这个类创建了多少个对象,他的class对象都是唯一的。
2、在连接和初始化阶段,其实静态变量经过两次的赋值,第一次是静态变量类型的默认值,第二次是我们真正给静态变量的值

.class、class.forname() 和 getClass() 的区别

相同

通过这几种方式,得到的都是java.lang.Class对象;都是类加载的产物

不同

1.出现的时期不同:Class.forname()在运行时加载;Class.class和对象名.getClass()是在编译时加载
2.Class c = C.class;JVM将使用的类C的类装载器将类C如内存(JVM的内存结构,前提是类C还未加载进内存),不对A进行初始化工作,返回C的Class对象,字节码
3.Class c = c.getClass()则是通过对象获得类,返回的是正确指向的对象,可能是本类也可能是父类,其已经被加载了并且也初始化
4.Class.forname(“全限定类名”),在运行时加载,对类进行加载,使用反射、

作用

1、获得类型类
Java中一切皆为对象,我们一般使用的对象都是直接或者间隔继承Object对象,Object有个方法getClass(),利用这个方法可以获得一个实例的类型类;
类型类是指一个类型的类Class<? extends Application> 类会继续与这个类 为类型类

2、获得类型的信息
getName():String:获得该类型的全称名称。
getSuperClass():Class:获得该类型的直接父类,如果该类型没有直接父类,那么返回null。
getInterfaces():Class[]:获得该类型实现的所有接口。
isArray():boolean:判断该类型是否是数组。
isEnum():boolean:判断该类型是否是枚举类型。
isInterface():boolean:判断该类型是否是接口。
isPrimitive():boolean:判断该类型是否是基本类型,即是否是int,boolean,double等等。
isAssignableFrom(Classcls):boolean:判断这个类型是否是类型cls的父(祖先)类或父(祖先)接口。

new 关键词 和newInstance()方法的区别:

1、在new之前,这个类可以没有被加载,没有加载时则会去触发JVM去加载;然而newInstance()只能类被加载才能正常的运行
2、Class对象的newInstance()(这种做法跟工厂设计模式相似)实际把new这个关键词所执行的步骤分为二步,Class加载对象,然后实例化对象,分步的好处是我们在调用class的静态加载方法class.forname ()获得更加的灵活性,提供了一种解耦的方法

工厂设计模式简介

1.需要配置文件 以键值对存储
如accountDao:cn.baidu.dao.imp.AccountDaoImpl
2.一个工厂类,里面通过静态代码块加载配置文件和加载类并且初始化,通过反射的方式在运行的状态进行获得类的属性和方法,通过Class.forname 和 newInstance() 将对象名为key和对象的引用为value存入Map中,这类似于Tomcat内部的加载servlet 还有Spring的控制反转,工厂进行装配也是工厂设计模式的原理
3.在主方法中 通过工厂类的方法 getObject(String key),通过对象名获得对象的引用,指向在JVM内存中堆的类。

发布了9 篇原创文章 · 获赞 8 · 访问量 513

猜你喜欢

转载自blog.csdn.net/One_hundred_nice/article/details/103607140