反射
当程序运行时,允许改变程序结构的变量类型,这种语言称为动态语言.我们认为java并不是动态语言,但是他却又一个非常突出的动态相关机制,俗称反射
Reflection 是java程序开发语言的特征之一,它允许运行的java程序获取自身的信息,并且可以操作类和对象的内部属性.
通过反射,我们可以在运行时获得程序或程序集中每一一个类型 成员和成员变量的信息.
程序中一般的对象类型都是在编译期就确定下来的,而java放射机制可以动态的创建对象并调用其属性,这样对象的类型在编译期是未知的.所以我们可以通过反射机制直接创建对象即使这个对象在编译期是未知的.
反射的核心: 是jvm在运行时才动态加载的类或调用方法或属性,他不需要事先知道运行对象是谁.
java反射框架提供一下功能:
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法(通过反射机制可以调用private)
- 在运行时调用任意一个对象的方法
反射的主要用途
当我们使用IDE时,当我们输入一个类并调用他的属性和方法时,一般***点 (.)***编译器就自动提示属性或者方法,这里就用到了反射.
反射最重要的用途是开发各种通用框架.
很多框架比如spring 都是配置化的,为了保证框架的通用性,他们可能根据配置文件加载不同的对象和类,调用不同的方法,这个时候就必须用到反射—运行时动态加载需要加载的对象.
反射的基本应用
-
获得Class对象
(1)、使用 Class类的 forName() 静态方法:
public static Class<?> forName(String className)
在JDBC开发中常用此方法加载数据库驱动:
Class.forName(driver)
(2)、直接获取某一个对象的 class,比如:
Class<?> klass = int.class;
Class<?> classInt = Integer.TYPE;
(3)、调用某个对象的getClass() 方法,比如:
StringBuilder str = new StringBuilder(“123”);
Class<?> klass = str.getClass(); -
判断是否为某个类的实例
一般地,我们用 instanceof关键字来判断是否为某个类的实例。同时我们也可以借助反射中Class对象的 isInstance()方法来判断是否为某个类的实例,它是一个 Native 方法:
public native boolean isInstance(Object obj); -
创建实例
通过反射来生成对象主要有两种方式。
(1)使用 Class 对象的 newInstance() 方法来创建对象对应类的实例。Class<?> c = String.calss; Object str = c.getInstance();
(2)、先通过 Class 对象获取制定的 Constructor 对象,在调用 Constructor 对象的 newInstance() 方法来创建实例。这种方法可以用指定的构造器构造类的实例。
//获取String所对应的Class对象 Class<?> c = String.class; //获取String类带一个String参数的构造器 Constructor constructor = c.getConstructor(String.class); //根据构造器创建实例 Object obj = constructor.newInstance("23333"); System.out.println(obj);
作者:南城刀
链接:https://www.jianshu.com/p/d6035d5d4d12
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。