java 反射常用记录

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;
    }

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值