--------------- android培训、java培训、期待与您交流!---------------
类的反射:就是把Java类中的各种成分映射成对应的java 类。(这样我就可以通过映射后类的各种方法对原来的类的各种成分进行操作了)
类的各种成分都有:构造方法,成员变量,类的方法,而这样在计算机里的内存里有类对象对应字节码,而字节码里面就包含了各种各样的信息(构造方法,成员变量,类的方法)。
而这些成分,都有对应的类型:
Mehodà类方法
Constructorà类构造器
Fieldà类的成员变量
Classà类
而字节码():有几种方法都可以得到:对象.getClass 类.class Class.forName(类);
下面举个例子:
package net.reflect;
//这是表示个点的类,测试通过反射来得到其对象的y的值。
public class ReflectPoint {
private int x;
public int y;
public ReflectPoint(int x, int y) {
this.x = x;
this.y = y;
}
}
//这是个测试类
package net.reflect;
import java.lang.reflect.*;
public class RefTest {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
ReflectPoint f = new ReflectPoint(3, 5);
Field fy = f.getClass().getField("y");
// fy它不是对象中的的值,而是类上的。一个变量
System.out.println(fy);
System.out.println(fy.get(f));
}
}
打印结果是:
public int net.reflect.ReflectPoint.y
5
很清楚的看到。fy对象并不是值,要得到值,需要通过get方法去对象中去取的值。
问题:为什么要用反射的方式去调用,而不是直接用创建对象,再调用的方式去做了??
例如:这样,如果我要在我的类的main函数里调用别的类的方法,但是我并不知道这个类,因为这个类要在运行时作为参数传递过来,这样我们在编译的时候就没法知道到底要运行哪个类的哪个方法了。而用反射机制就可以,我们知道main方法里有参数,为字符串数组。举个例子:
package net.reflect;
public class TestMain {
//这是将要被调用Main方法的类
/**
* @param args
*/
public static void main(String[] args) {
for (String arg : args) {
System.out.println(arg);
}
}
}
package net.reflect;
import java.lang.reflect.*;
public class RefTest {
//这是测试类
/**
* @param args
*/
public static void main(String[] args) throws Exception {
String startClassName = args[0];
// //得到的是main方法,这个方法的参数类型是String数组类型
Method m = Class.forName(startClassName).getMethod("main",
String[].class);
// 这里的意思是要调用那个对象的方法,如果为Null说明不需要 对象.方法,例如:str.getClass();这就说明 main
// 方法是静态方法;二个,后面的参数值是另外的类里面Main方法参数的值。
// 这里main函数(若没有Object)会把数组拆分成3个字符串对象,所以用Object转换成一个对象,字符串数组也是Object类型
m.invoke(null, (Object)new String[] { "xxx", "yyy", "zzz" });
}
}
执行 cmd命令下的 Java net. reflect.RefTestnet.reflect.TestMain
结果如下:
xxx
yyy
zzz
这样我们就可以动态的接收运行时别的类传递过来的参数借此调用该类的方法了。
--------------- android培训、java培训、期待与您交流!---------------