---------------------- android培训 、java培训 、期待与您交流! ----------------------
反射
反射的基石 Class类
Class类 代表所有的java类
Class的实例对象对应各个java类在内存中的字节码。
一个类被类加载器加载到内存中,占用一片空间,这个空间里面的内容就是类的字节码,
不同类的字节码是不同的,所以他们在内存中的内容是不同的,这一个个空间可分别用
一个个的对象来表示,这些对象具有相同的类型,这个类型就是Class
如何得到各个字节码对应的实例对象(Class类型)
1 类名.class
2 对象.getClass();
3 Class.forName("类名");
九个预定义Class实例对象
boolean、byte、char、short、int、long、float 和 double
和关键字 void 也表示为 Class 对象。
int.class=integer.TYPE
反射 反射就是把java类中的各种成份映射成相应的java类
反射的步骤
1 获取类的字节码对应的实例对象
2 通过类的字节码实例对象的相关方法获得类的成员的字节码实例对象。
3 通过这些成员的字节码实例对象的各自的方法完成对自己的重新定位。(此处说法不托,但不知道怎么说)
构造方法反射
Constructor类代表某个类中的一个构造方法类型
得到某个类所有的构造方法 Constructor[] getConstructors();
得到某一个构造方法 Constructor getConstructor(Class<?>... parameterTypes);
调用方法时要用获得方法时同样的对象
成员变量反射
Field类 代表某个类中成员变量的类型
Field getField(String name) 获取一个公有的成员变量
Field[] getFields() 获取所有公有的成员变量
Field getDeclaredField(String name) 获取一个成员变量,包括私有的
Field[] getDeclaredFields() 获取所有成员变量,包括私有
成员方法反射
Method getMethod(String name, Class<?>... parameterTypes) 获取一个公有的方法
Method[] getMethods() 获取所有的公有的方法
Method getDeclaredMethod(String name, Class<?>... parameterTypes) 获取一个方法,包括私有
Method[] getDeclaredMethods() 获取所有的方法,包括私有
静态方法不需要传对象,对象设为null
package reflex;
public class FieldRef {
private String name = "hks";
private String address = "shengzhen";
int[] num = {1,3,5,7,9};
public void add(){
System.out.println("addddddddddd");
}
public void save(int i ,String s ){
System.out.println(i+"---"+s);
}
public FieldRef() {
}
public FieldRef(String name, String address, int age) {
super();
this.name = name;
this.address = address;
this.age = age;
}
private int age = 20;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
package reflex;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;
public class Test {
public static void main(String[] args) throws Exception {
// 构造方法反射
// 创建FieldRef对象
FieldRef fr = new FieldRef();
// 获取构造方法对应的字节码对象,这里传入什么类型的参数,调用的时候,就要用什么类型的参数
Constructor constructor = fr.getClass().getConstructor(String.class,
String.class, int.class);
// 调用构造方法重新进行初始化
FieldRef fr1 = (FieldRef) constructor.newInstance("huang", "shen", 25);
System.out.println(fr1.getName() + "--" + fr1.getAddress() + "---"
+ fr1.getAge());
// 成员变量反射
// 获取属性对应的字节码对象,因为是私有的所以用getDeclaredField();
Field field = fr.getClass().getDeclaredField("name");
// 设置setAccessible为true才可以操作私有成员
field.setAccessible(true);
// 找到字节码成员属性对应的具体对象
String oldName = (String) field.get(fr);
if (field.getType() == String.class) {
String newName = "huangkeshuai";
field.set(fr, newName);
}
System.out.println(fr.getName());
// 成员方法反射
// 获取方法对应的字节码对象,
Method m = fr.getClass().getMethod("save", int.class, String.class);
// 调用其自身的invoke方法。
m.invoke(fr, 2222, "fffff");
// 数组的反射
Field fi = fr.getClass().getDeclaredField("num");
int[] in = (int[]) fi.get(fr);
System.out.println(in[0]);
System.out.println(Array.get(in, 1));
for (int i : in) {
System.out.println(i);
}
//集合反射
Field fie =fr.getClass().getDeclaredField("li");
List li =(List)fie.get(fr);
for(Object o : li){
System.out.println(o);
}
//javabean反射
String name="name";
//获取属性的PropertyDescriptor对象
PropertyDescriptor pd = new PropertyDescriptor(name, fr.getClass());
//获取属性对应的get方法
Method m1 = pd.getReadMethod();
//方法调用其自身,就等于调用getName方法
Object str=m1.invoke(fr);
System.out.println(str);
}
}
---------------------- android培训 、java培训 、期待与您交流! ----------------------