Java反射机制
- 1、Java 什么是反射机制
- 2、反射能干啥
- 3、怎样得到反射的类
- 4、反射的优缺点
1、Java 什么是反射机制
Java反射机制是在运行状态中,对于任意一个类,都能知道这个类所有的属性和方法;
对于任意一个对象,都能调用任意一个属性和方法;
这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
通俗的讲:反射就是把Java类中的各个部分,映射成一个个的Java对象,例如,一个类有:成员变量,方法,构造方法,等信息,利用反射技术咱们可以把这些组成部分映射成一个个对象,拿到这些对象后就可以做一些事情。
2、反射能干啥
一般来说反射是用来做框架的,我们自己平时的项目开发过程中,基本很少会直接用到反射机制,但很多设计开发都与反射机制有关,例如模块化的开发,通过反射机制去调用对应的字节码;动态代理设计模式也采用了反射机制,还有我们经常使用的Spring····等框架也大量使用到了反射机制。
举例:
1、我们在使用JDBC连接数据库使用Class.forName()通过反射记载数据库的驱动程序;
2、Spring配置文件里的常见的bean配置,可以用反射很轻易的就可以实现:解析xml然后把xml里的内容作为参数,利用反射创建对象。
3、动态配置实例的属性;
4、····
虽然反射在日常的开发中用到的不多,但是咱们还必须搞懂它,因为搞懂了反射以后,可以帮助咱们理解框架的一些原理。所以说有一句很经典的话:反射是框架设计的灵魂。
3、怎样得到反射的类
反射相当于是对一个类进行解剖,想解剖一个东西,前提是首先你得拿到这个东西,那么怎么得到咱们想解剖的类呢?
首先我们知道,我们写的Java代码是 在 .java文件里,通过编译成 .class文件再执行。而Java这门面向对象的语言的宗旨是,一切皆对象,所以所以java认为 这些编译后的 class文件也是一种对象,它也给抽象成了一种类,这个类就是Class,可以再API里面查看。
有一个方法forName(String className); 而且是一个静态的方法,这样咱们就可以得到想反射的类了
public static void main(String[] args) throws ClassNotFoundException {
Class<?> aClass = Class.forName("com.kkb.quickstart.entity.User");
}
我们知道一个类里一般有构造函数、方法、成员变量(字段/属性)这三部分组成
翻阅API文档,可以看到Class对象提供了如下常用方法:
//得到构造方法,可以创建对象
public Constructor getConstructor(Class<?>…parameterTypes)
//得到方法
public Method getMethod(String name,Class<?>… parameterTypes)
//得到属性
public Field getField(String name)
//得到私有的构造函数
public Constructor getDeclaredConstructor(Class<?>…parameterTypes)
//得到私有的方法
public Method getDeclaredMethod(String name,Class<?>… parameterTypes)
//得到私有的属性
public Field getDeclaredField(String name)
//这些方法分别用于帮咱们从类中解剖出构造函数、方法和成员变量(属性)。
4、反射的优缺点
优点:
运行期类型的判断,动态加载类,提高代码灵活度
缺点:
1、性能瓶颈:反射相当于一系列解释操作,通知JVM要做的事情,性能比直接的Java代码要慢很多。
2、安全问题:让我们可以动态操作改变类的属性同时也增加了类的安全隐患。