1、反射是什么?
Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。java本来是一个静态的语言,然而因为有了反射机制,使得java成为了一个伪动态语言。
2、反射一些常用的方法
1.获得类的名字
getName()获得包名+类名
getSimpleName()获得类名
2.获得类的属性
getFields()只能找到public属性
getDeclaredFields()找到全部属性
3.获得指定属性的值
getDeclaredFields(“name”)
name.setAccessible(true):暴力反射,不能直接操作程序的私有属性,我们需要关闭程序的安全检测
4.获得类的方法
getMethods()获得本类及其父类的全部public方法
getDeclaredMethods()获得本类的所有方法
invoke()激活
getMethods(参数) 获取指定方法
5.获取构造器
getConstructors()获取public修饰的构造器
getDeclaredConstructors()获取所有的构造器
getConstructors(参数) 获取指定构造器
3.特点
尽管反射机制带来了极大的灵活性及方便性,但反射也有缺点。反射机制的功能非常强大,但不能滥用。在能不使用反射完成时,尽量不要使用,原因有以下几点:
1、性能问题。
Java反射机制中包含了一些动态类型,所以Java虚拟机不能够对这些动态代码进行优化。因此,反射操作的效率要比正常操作效率低很多
。我们应该避免在对性能要求很高的程序或经常被执行的代码中使用反射。而且,如何使用反射决定了性能的高低。如果它作为程序中较少运行的部分,性能将不会成为一个问题。
2、安全限制。
使用反射通常需要程序的运行没有安全方面的限制
。如果一个程序对安全性提出要求,则最好不要使用反射。
3、程序健壮性。
反射允许代码执行一些通常不被允许的操作,所以使用反射有可能会导致意想不到的后果。反射代码破坏了Java程序结构的抽象性
,所以当程序运行的平台发生变化的时候,由于抽象的逻辑结构不能被识别,代码产生的效果与之前会产生差异。