Java 中的反射机制(含数组参数)
Java 中的反射机制是一种强大的工具,可以在运行时获取类的内部信息,包括modifiers、superclass、interfaces、fields 和 methods 的所有信息,并可以在运行时改变 fields 的内容或唤起 methods。通过反射机制,我们可以实现动态地执行对应的方法,生成相应的类,远程调用方法等。
反射机制的原理是通过 Reflection APIs 取得任何一个已知名称的 class 的内部信息。Reflection 是 Java 被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过 Reflection APIs 取得任何一个已知名称的 class 的内部信息,包括其 modifiers(诸如 public, static 等等)、superclass(例如 Object)、实现之 interfaces(例如 Cloneable),也包括 fields 和 methods 的所有信息,并可于运行时改变 fields 内容或唤起 methods。
在 Java 中,我们可以使用反射机制来实现动态地执行对应的方法。例如,我们可以根据字符串去做我们自己想要的事,包括动态执行对应的方法,生成相应的类。在传送数据的时候,大部分都是传字符串的(HTTP,socket)等,我们接受到这些字符串时,再根据这些字符串内容而去做相应的事,那是一件非常不错的事,可以远程调用方法(客户端发送指定的字符串,让服务器根据反射去执行对应的方法)。
下面是一个基本的反射机制的示例代码:
```java
import java.lang.reflect.Method;
public class TestInt {
public String test(String name, int i) {
System.out.println("name:" + name);
System.out.println(i);
return "反射成功!";
}
public static void main(String[] args) {
try {
// 获取 class 文件,可以 Class.for("Test") 获取,这样也可以根据字符串生成类啦
Class te = TestInt.class;
Class[] cl = new Class[2];
// 添加参数类型
cl[0] = String.class;
cl[1] = int.class;
System.out.println("11111111");
// 根据 public 的方法,以及参数,参数是 Class[] 形式
Method method = te.getMethod("test", cl);
System.out.println("222222222222");
// 开始填充参数
Object[] params = new Object[2];
// params[0] = new String("soda");
params[0] = new String("soda");
params[1] = new Integer(23);
System.out.println("22222222222");
// 获取该 class 的实例
Object obj = te.newInstance();
// 进行方法调用
Object result = method.invoke(obj, params);
System.out.println("结果:" + result);
} catch (Exception e) {
System.out.println(e);
}
}
}
```
在上面的代码中,我们首先获取了 TestInt 类的 Class 对象,然后使用 getMethod 方法获取了 test 方法,最后使用 invoke 方法来调用 test 方法,并传递参数。编译执行后,我们可以看到想要的结果。
在实际应用中,反射机制可以应用于远程调用方法、生成动态类、实现依赖注入等场景。