在安卓中 有些方法是private 或者加了@hide标记 想要调用他就不能直接通过类对象在外部调用,就可以用到反射的原理来做到。示例代码如下
MyBean myBean=new MyBean(); //创建类对象
Class<?> class1= myBean.getClass(); //获取类
Method method= null;
try {
//获取方法 并设置参数类型 参数类型会自己加上 不用打
method = class1.getDeclaredMethod("setA", int.class);
//然后设置方法可访问
method.setAccessible(true);
//设置要传入的参数
Object[] arg1s = {99};
//然后后用获取到的方法引起 参数是类对象和要传入的参数
method.invoke(myBean,arg1s);
//会有一大堆Exception 直接用exception全部框起来省事
} catch (Exception e) {
Log.i(TAG, "go: "+e);
e.printStackTrace();
}
Log.i("aaaa", "onCreate: "+myBean.getA());
}
String TAG="aaaa";
MyBean类如下
public class MyBean {
private int a;
private int b;
private int c;
public int getA() {
return a;
}
private void setA(int a) {
this.a = a;
}
private int getB() {
return b;
}
private void setB(int b) {
this.b = b;
}
private int getC() {
return c;
}
private void setC(int c) {
this.c = c;
}
基本上都是private的 在外部直接用肯定是不行的。
用反射的方法之后,运行结果如下图 可以看到log正常打出 说明我们setA()方法调用成功了。
调用构造方法也类似:写一个private的构造方法
private MyBean(int a, int b, int c) {
this.a = a;
this.b = b;
this.c = c;
Log.i("aaaa", "MyBean: a"+this.a+"b"+this.b+"c"+this.c);
}
然后:
Constructor constructor=class1.getDeclaredConstructor
(int.class,int.class,int.class);//这里有多少个参数就要穿多少个值
//还有要设置可访问 不然会报找不到的错误
constructor.setAccessible(true);
//这里同上
constructor.newInstance(66,77,88);
运行结果:
3.再来访问private的变量
如
public class MyBean {
private int a;
private int b;
private int c;
private String name;
public String getName() {
return name;
}
我们来操作这个String变量,为了方便待会取值 加个public的get ,set通过反射来实现。
Field field = class1.getDeclaredField("name");
field.setAccessible(true);
field.set(myBean,"Dullyoung gg");
Log.i(TAG, "go: "+myBean.getName());
运行结果
今天初学 有不对还请赐教。