通过反射方法调用DemoData中的私有方法。
DemoData.java
public class DemoData {
private int id;
private String name;
private String title;
private int getId() {
return id;
}
private void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
public class MainActivity extends AppCompatActivity {
private final static String TAG = "Reflection";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setDemoData();
}
public void setDemoData(){
Class<?> clz = null;
try {
clz = Class.forName("com.demo.audiodemo.DemoData");
Object obj1 = clz.newInstance();
Object obj2 = clz.newInstance();
Method setId = clz.getDeclaredMethod("setId", int.class); //注意访问私有变量的方法
Method setName = clz.getMethod("setName", String.class);
Method setTitle = clz.getMethod("setTitle", String.class);
setId.setAccessible(true); //注意访问私有变量的方法
Method getId = clz.getDeclaredMethod("getId");
Method getName = clz.getMethod("getName");
Method getTitle = clz.getMethod("getTitle");
getId.setAccessible(true);
setId.invoke(obj1, 123);
setName.invoke(obj1, "红楼梦");
setTitle.invoke(obj1, "枉凝眉");
setId.invoke(obj2, 456);
setName.invoke(obj2, "Sophie Zelmani");
setTitle.invoke(obj2, "Going Home");
int id1 = (int) getId.invoke(obj1);
String name1 = (String) getName.invoke(obj1);
String title1 = (String) getTitle.invoke(obj1);
int id2 = (int) getId.invoke(obj2);
String name2 = (String) getName.invoke(obj2);
String title2 = (String) getTitle.invoke(obj2);
Log.i(TAG, "get id1=" + id1);
Log.i(TAG, "get name1=" + name1);
Log.i(TAG, "get title1=" + title1);
Log.i(TAG, "get id2=" + id2);
Log.i(TAG, "get name2=" + name2);
Log.i(TAG, "get title2=" + title2);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
总结:
//获取类
clz = Class.forName(“com.demo.audiodemo.DemoData”);
//获取类的实例
Object obj1 = clz.newInstance();
//获取私有方法,并设置访问
Method setId = clz.getDeclaredMethod(“setId”, int.class);
setId.setAccessible(true);
//获取共有方法, String.class和int.class未方法参数类型
Method setName = clz.getMethod(“setName”, String.class);
//方法调用
setId.invoke(obj1, 123);
setName.invoke(obj1, “红楼梦”);