基本概念
Java反射机制是在运行状态时,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功能就称为java语言的反射机制。
那么我们刚刚说的那几个和反射相关的类同样是这样的
Class类抽象出了java中类的特征并提供了一些方法,Constructor抽象出了java中所有的构造函数的特征以及提供一些方法....(最开始接触java安全的时候我就经常会被java的Class类型搞昏)
知道了这几个类之后,我们再回到怎么实现调用一个对象的任意方法这个问题上来,分三步走:
首先获得这个对象对应的Class类的实例
因为Class这个类存储着一个类的所有信息:属性、方法、构造函数....所以我们可以通过Class类的实例来获取你想要调用的那个方法
拿到了对应的方法过后,我们可以给这个方法传入对应的参数来调用它。
上面是一个大体的流程,现在我们来看一下用代码怎么实现这三个流程
获得User对象的Class类实例
有三种方式获得Class类实例:
调用Class类的静态方法forName获取某个类的Class类实例:
Class clz = Class.forName("com.axin.User");
访问某个类的class属性,这个属性就存储着这个类对应的Class类的实例:
Class clz = com.axin.User.class;
调用某个对象的getClass()方法:
Class clz = (new User()).getClass();
获取setName方法
我们之前已经提到了Method这个类,java中所有的方法都是Method类型,所以我们通过反射机制获取到某个对象的方法也是Method类型的。通过Class对象获取某个方法:
调用setName方法
Method类中有一个invoke方法,就是用来调用特定方法的,
第一个参数是调用该方法的对象,第二个参数是一个可变长参数,是这个方法的需要传入的参数,描述的不够直观,直接看代码
接着上文代码:
method.invoke((new User()), "axin");
或者
User user = new User();
method.invoke(user, "axin");
流程走完了,让我们来看看整体程序:
可以看到我们成功调用 setName 方法,并设置 name 为“axin”