本文共 3172 字,大约阅读时间需要 10 分钟。
通过反射方法调用DemoData中的私有方法。
DemoData.javapublic 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, “红楼梦”);转载地址:http://ajre.baihongyu.com/