1、JAVA的反射机制是在运行状态中
2、在运行时判断一个对象所属的类,调用任意一个对象的方法;
在运行时构造任意一个类的对象,判断任意一个类所有的成员变量和方法。
(要想解剖一个类,必须先要获取到该类的字节码文件对象(class)。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.)
3、Person.java
package com.example.reflecdemo;
public class Person {
private String name;
private String age;
public Person(String name, String age) {
super();
this.name = name;
this.age = age;
}
public Person() {
super();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
4、使用反射操作属性
private void field()
throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException {
//第一种方法
//Class class1 = Person.class;
//第二种方法
Class class1 = new Person().getClass();
//第三种方法 使用反射操作属性(变量)
//Class class1 = Class.forName("reflect.Person");
//得到所有的属性
//class1.getDeclaredFields();
// 得到对象
Person p = (Person) class1.newInstance();
// 得到指定的属性
Field f = class1.getDeclaredField("name");
// 设置方法允许操作私有属性
f.setAccessible(true);
// 赋值
f.set(p, "zhangsan");
// 获取值(Person中设置属性为私有,需要设置一个方法setAccessible(true))
Log.d(TAG, "===>" + f.get(p));
}
5、使用反射操作构造器
private static void constructor() throws ClassNotFoundException, NoSuchMethodException, InstantiationException,
IllegalAccessException, InvocationTargetException {
//Class class2 = Class.forName("reflect.Person");
Class class2 = Person.class;
// 得到所有的构造方法
// class2.getConstructor();
// 得到指定的构造方法
Constructor c = class2.getConstructor(String.class, String.class);
// 得到对象
Person p = (Person) c.newInstance("lisi", "100");
Log.d(TAG, "name===>" + p.getName() + ",age===>" + p.getAge());
}
6、使用反射操作方法
private static void method() throws ClassNotFoundException, InstantiationException, IllegalAccessException,
NoSuchMethodException, InvocationTargetException {
//Class class3 = Class.forName("reflect.Person");
Class class3 = Person.class;
// 得到对象
Person p = (Person) class3.newInstance();
//获取所有普通方法
class3.getDeclaredMethods();
//获取指定参数普通方法
Method m = class3.getDeclaredMethod("setName", String.class);
m.invoke(p, "wangmazi");
Log.d(TAG, "name===>" + p.getName());
}