鉴于android某些有用的API被Google大神隐藏了,需要使用java反射机制。
记录一些java反射机制用法:
1.定义一个People模型:
package cc.fanshe;
public class People {
//私有属性,外部无法访问
private String name;
private int age;
private float width;
public People(){
}
public People(String name){
this(name, 0);
}
public People(String name, int age){
this(name, age, 0);
}
public People(String name, int age, float width){
this.setName(name);
this.setAge(age);
this.setWidth(width);
}
private void sayHi(String world){
System.out.println(this.getName()+"说" + world);
}
@Override
public String toString() {
return "名字:"+this.getName()+" 年龄:"+this.getAge()+" 体重:"+this.getWidth();
}
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 float getWidth() {
return width;
}
public void setWidth(float width) {
this.width = width;
}
}
2. 根据类名获取Class
Class class1 = Class.forName("cc.fanshe.People");
包名+类名
3. 调用无参构造方法获取实例
Object obj = class1.newInstance();
4. 设置私有属性可访问
Field nameField = class1.getDeclaredField("name");
nameField.setAccessible(true);
5. 对私有属性设置数据
nameField.set(obj, "山野书生");
运行结果:
获取构造方法
1. 根据类名获取Class
Class<?> class2 = Class.forName("cc.fanshe.People");
2. 设置构造方法的参数值类型
Constructor<?> con2 = class2.getConstructor(new Class[]{String.class, int.class, float.class});
3. 获取实例化对象并传入值
Object obj2 = con2.newInstance(new Object[]{"山野村夫", 26, 157});
4. 执行toString()方法
System.out.println("----33----"+obj2.toString());
5. 运行结果
获取私有方法并调用:
1. 根据方法名获取私有方法:
Method method2 = class2.getDeclaredMethod("sayHi", String.class);
"sayHi"---People的私有方法名,
String.class--sayHi方法的参数类型
2. 设置私有方法可调用并调用:
method2.setAccessible(true);
method2.invoke(obj2, "Hello Word....");
3. 运行结果:
以上是java反射机制的简单使用方法,记录一下。O(∩_∩)O哈哈~