反射调用方法步骤
- 1.获取
Class
对象,使用Class.forName("类的全限定名")
来加载类的实例,
- 2.获取要调用的方法的
Method
对象,使用Class对象.getMethod("方法名",形参列表)
获取要调用的方法.
- 3.使用
Method对象.invoke(该方法的拥有者,实参列表)
调用方法.
- 方法的拥有者可以是类和实例,
- 如果是静态方法则拥有者设为类(
Class
对象),
- 如果是实例方法,则方法的拥有者设置为实例(
Object
对象).这时就要求先创建好实例(Object
对象).
- 创建实例时,可以通过调用无参构造方法来创建。
Class对象.newInstance()
可以调用无参构造器,创建默认实例
- 创建实例时,也可以调用带参构造器,通过
Class对象.getConstructor(形参列表)
可以创建一个指定的构造器(Constructor
),然后调用Constructor对象.newInstance(实参列表);
就可创建指定参数的实例.
实例
项目结构
1 2 3 4 5 6
| E:\workspace_web2\TestReflect └─src ├─test │ └─Test.java └─tools └─Tools.java
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| package tools; public class Tools { String name; String sex;
public Tools(String name, String sex) { super(); this.name = name; this.sex = sex; } public static void publicStaticMethod() { System.out.println("公有 无参 静态 方法 被调用..."); } public static void publicStaticMethod(String arg1, String arg2) { System.out.println("公有 带参 静态 方法 被调用..."); System.out.println(" 参数1:" + arg1 + ",参数2:" + arg2); } public void puablicInstanceMethod() { System.out.println("公有 无参 实例 方法 被调用..."); System.out.println("Tools [name=" + name + ", sex=" + sex + "]"); } public void puablicInstanceMethod(String arg1, String arg2) { System.out.println("公有 带参 实例 方法 被调用..."); System.out.println(" 参数1:" + arg1 + ",参数2:" + arg2); } }
|
Tools.java
中定义了一个带参的构造方法,以及无参的静态方法,带参的静态方法,无参的实例方法,带参的实例方法.下面使用反射来调用这些方法.
Test.java
使用反射会抛出大量的异常,但是本文的重点在于反射,所以我把所有的异常简单的抛出.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| package test; import java.lang.reflect.Constructor; import java.lang.reflect.Method; public class Test { public static void main(String[] args) throws Exception {
callPublicInstanceMethod("Hello", "World"); } private static void callPublicStaticMethod() throws Exception { Class<?> classIns = Class.forName("tools.Tools"); Method method = classIns.getMethod("publicStaticMethod"); method.invoke(classIns); } private static void callPublicStaticMethod(String arg1, String age2) throws Exception { Class<?> classIns = Class.forName("tools.Tools"); Method method = classIns.getMethod("publicStaticMethod", String.class, String.class); method.invoke(classIns, arg1, age2); } private static void callPublicInstanceMethod() throws Exception { Class<?> class1 = Class.forName("tools.Tools"); Constructor<?> constructor = class1.getConstructor(String.class, String.class); Object object = constructor.newInstance("小明", "男"); Method method = class1.getMethod("puablicInstanceMethod"); method.invoke(object); } private static void callPublicInstanceMethod(String arg1, String arg2) throws Exception { Class<?> class1 = Class.forName("tools.Tools"); Constructor<?> constructor = class1.getConstructor(String.class, String.class); Object object = constructor.newInstance("小明", "男"); Method method = class1.getMethod("puablicInstanceMethod", String.class, String.class); method.invoke(object, arg1, arg2); } }
|
调用静态方法
调用无参的静态方法
1 2 3 4 5 6 7 8 9 10 11
| private static void callPublicStaticMethod() throws Exception { Class<?> classIns = Class.forName("tools.Tools"); Method method = classIns.getMethod("publicStaticMethod"); method.invoke(classIns); }
|
运行效果
调用带参的静态方法
1 2 3 4 5 6 7 8 9 10 11
| private static void callPublicStaticMethod(String arg1, String age2) throws Exception { Class<?> classIns = Class.forName("tools.Tools"); Method method = classIns.getMethod("publicStaticMethod", String.class, String.class); method.invoke(classIns, arg1, age2); }
|
运行效果
1 2
| 公有 带参 静态 方法 被调用... 参数1:Hello,参数2:World
|
调用实例方法
调用无参实例方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| private static void callPublicInstanceMethod() throws Exception { Class<?> class1 = Class.forName("tools.Tools"); Constructor<?> constructor = class1.getConstructor(String.class, String.class); Object object = constructor.newInstance("小明", "男"); Method method = class1.getMethod("puablicInstanceMethod"); method.invoke(object); }
|
运行效果:
1 2
| 公有 无参 实例 方法 被调用... Tools [name=小明, sex=男]
|
调用带参实例方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| private static void callPublicInstanceMethod(String arg1, String arg2) throws Exception { Class<?> class1 = Class.forName("tools.Tools"); Constructor<?> constructor = class1.getConstructor(String.class, String.class); Object object = constructor.newInstance("小明", "男"); Method method = class1.getMethod("puablicInstanceMethod", String.class, String.class); method.invoke(object, arg1, arg2); }
|
运行效果:
1 2
| 公有 带参 实例 方法 被调用... 参数1:Hello,参数2:World
|