public class TestHelper {
private String value = "123";
private void test1(String name) {
Log.v("tag_2", "反射方法测试 private " + name);
}
}
1、反射一个private 变量值,并再次为其赋值:
try {
Class<?> clazz = Class.forName("com.example.weichenglin1.test.TestHelper");
Field field2 = clazz.getDeclaredField("value");
field2.setAccessible(true);
TestHelper testHelper = (TestHelper) clazz.newInstance();
Log.v("tag_2", field2.get(testHelper) + "");//获取值
field2.set(testHelper, "abc");//重新设置值
Log.v("tag_2", field2.get(testHelper) + "");//获取值
} catch (Exception e) {
e.printStackTrace();
}
2、反射一个private 方法,并执行:
try {
Class<?> clazz = TestHelper.class;//或者:
Class<?> clazz = Class.forName("com.example.weichenglin1.test.TestHelper");
Method m1 = clazz.getDeclaredMethod("test1", String.class);
m1.setAccessible(true);//设置可以调用private method
TestHelper testHelper = (TestHelper) clazz.newInstance();
m1.invoke(testHelper, "but");
} catch (Exception e) {
e.printStackTrace();
}
3、反射一个类并调用这个类的方法,使用场景:比如用了插件化,宿主加载了插件中的LauncherFragment类。
但是宿主只拿到了其父类Fragment,但是宿主又需要调用LauncherFragment的onKeyDown方法:
private boolean invokeOnKeyDown(int keyCode, KeyEvent event) {
try {
Fragment fragment = xx ;//别的地方生成的
Class<?> fragClazz = Class.forName("com.launcher.LauncherFragment");
Method method = fragClazz.getMethod("onKeyDown", int.class, KeyEvent.class);
return (boolean) method.invoke(fragment, keyCode, event);
} catch (Exception e) {
e.printStackTrace();
}
return true;
}