通过学习了解到, Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
Java反射机制主要提供下面几种用途:
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法
一个例子程序就能很好的解释反射了.
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Reflection {
public static void main(String[] args) throws ClassNotFoundException,
InstantiationException, IllegalAccessException,
IllegalArgumentException, InvocationTargetException {
String str = "T";
Class c = Class.forName(str);// Class类表示正在运行的类,它没有构造方法,现在的class类所表示的类是T
Object o = c.newInstance();// 创建正在运行的Class对象所表示的类的一个实例 此时就是 new T()
// 相当于 Object o =new T() o就可以当一个正常的实例T()使用了 也可以直接转换 T
// o=(T)c.newInstance()
System.out.println(o.getClass().getName());
//Field 类能拿到一个类的属性 参考java.lang.reflect.*
Method methods[] = c.getMethods();
for (Method m : methods) {
if (m.getName().equals("f")) {
// m.invoke(o, null);//调用m这个方法 相当于o.m()
// 第二个参数是m这个方法的可变参数,可以根据情况传0-n个参数
m.invoke(o, 1, 2);
// 例如,m.invoke(o,"aa",5,"ss")
//m.getReturnType() 拿到返回值类型
Object ps[] = m.getParameterTypes();//可以查看这个方法的参数类型
for (Object p : ps) {
System.out.println(p.toString());//一次打印出方法m的参数类型int,int
}
}
}
}
}
class T {
public T() {
System.out.println("T constractor!");
}
public void f(int i, int j) {
System.out.println("T fff");
}
}