每日一问:
在java中如果仅仅知道一个类的类名,能否动态得到类的定义信息,包括哪些方法和属性等等?
目录
答案:可以通过反射做到
那么--
什么是java反射机制?
概念:
java反射机制是在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法;并且对于任意一个对象,都能调用他的任意一个方法和属性--这种动态获取信息以及动态调用对象的方法的功能称为java语言的反射机制。
java反射的作用?
动态获取类的信息
java反射相关的类?
java反射相关的类主要有:
- Class类型
- Constructor构造方法
- Method方法
- Field属性
- 所有类都在java.lang.reflect包中(除Class外)
反射API将类的类型、方法、属性都封装成了类,其中最重要的类是Class,可以说,反射的使用都是从Class开始。
class类
一旦class文件被加载到内存,就会为其创建一个Class对象。任何类被使用时都会创建一个Class对象。
Class类是Java反射机制的基础,通过Class类,可以得到一个类的基本信息。
获得Class的三种方法
要使用Class类的方法,必须先获得该类的Class类的实例,获得Class类实例的常用方法有如下三种:
- Object类中的getClass方法:适用于通过对象获得Class实例的情况
- 类名.class方式:适用于通过类名获得Class实例的情况
- Class类的静态方法 forName(String name)
获得Constructor类实例
Constructor实例通过Class实例获得,Class类中定义了如下方法:
Constructor<T> getConstructor(Class... parameterTypes) : 通过指定参数类型,返回构造方法实例。
Constructor类可以通过getXXX方法获得构造方法的基本信息:
getName:返回构造方法的名字 。
除了获得构造方法的基本信息,还可以创建实例:
newInstance(Object... initargs) :创建实例
获得Field实例
获得Field实例,都是通过Class中的方法实现:
public Field getField(String name)通过指定Field名字,返回Field实例(注意field访问权限)
Field类将类的属性进行封装,可以获得属性的基本信息、属性的值,也可以对属性进行赋值.
- getName:返回属性的名字
- set:设置属性值
获得Method实例
Method实例都是通过Class类的方法获得:
Method getMethod(String name, Class... parameterTypes) : 通过指定方法名,参数类型,返回一个Method实例
Method类将类中的方法进行封装,可以动态获得方法的信息,例如:
- getName:获得方法名字
- getParameterTypes:获得方法参数类型
除了动态获得方法信息外,Method还能动态调用某一个对象的具体方法:
invoke(Object obj, Object... args) :使用obj调用该方法,参数为args
反射优点
优点:
1.
增加程序的灵活性,可以在运行的过程中动态对类进行修改和操作。
2.
提高代码的复用率,比如动态代理。
3.
可以在运行时轻松获取任意一个类的方法、属性,并且还能通过反射进行动态调用。
反射缺点
缺点:
1.
反射会涉及到动态类型的解析,导致性能要比非反射调用更低。
2.
使用反射技术通常要在一个没有安全限制的程序运行。
3.
反射可以绕过一些限制访问的属性或者方法,可能会导致破坏代码本身的抽象性。