代码模拟invokedynamic指令invokevirtual指令调用方法
来源:互联网 发布:手机时间提醒软件 编辑:程序博客网 时间:2024/06/03 19:37
public class TestC { static interface Abc { void a(); } static class B implements Abc { @Override public void a() { System.out.println("called"); } } public static void mainvirtual(String[] args) throws Throwable { Object o = new B(); System.out.println(o.getClass()); MethodType type = MethodType.methodType(void.class); MethodHandle mh = MethodHandles.lookup().findVirtual(o.getClass(), "a", type).bindTo(o); mh.invokeExact(); } public static void main(String[] args) throws Throwable { Object o = new B(); System.out.println(o.getClass()); MethodType type = MethodType.methodType(void.class); MethodHandle mh = MethodHandles.lookup().findVirtual(o.getClass(), "a", type).bindTo(o); CallSite cs = new ConstantCallSite(mh); cs.dynamicInvoker().invokeExact(); } }
调用父类方法:
public class T1 { public void a(){ System.out.println("t1"); } public static void main(String[] args) throws Throwable { T2 t = new T2(); MethodType mt = MethodType.methodType(void.class); MethodHandle amh = MethodHandles.lookup().findSpecial(T1.class, "a", mt, T1.class); amh.invoke(t); }}class T2 extends T1{ public void a(){ System.out.println("t2"); }}class T3 extends T2{ public void a(){ System.out.println("t3"); }}
https://docs.oracle.com/javase/8/docs/api/java/lang/invoke/MethodHandles.Lookup.html#findSpecial-java.lang.Class-java.lang.String-java.lang.invoke.MethodType-java.lang.Class点击打开链接
MethodHandle有一些invokeDynamic的安全限制。
调用MethodHandles.lookup()的类要与findSpecial最后一个参数相同。
public class T1 { public static void main(String[] args) throws Throwable { T3 t = new T3(); MethodType mt = MethodType.methodType(void.class); MethodHandle amh = T2.lookup().findSpecial(T2.class, "a", mt, T2.class); amh.invoke(t); }}class T2{ public void a(){ System.out.println("t2"); } public static MethodHandles.Lookup lookup(){ return MethodHandles.lookup(); }}class T3 extends T2{ public void a(){ System.out.println("t3"); }}
当然这代码有点。。。你也可以倔强的这么做:
public class T1 { public static void main(String[] args) throws Throwable { T3 t = new T3(); MethodType mt = MethodType.methodType(void.class); MethodHandles.Lookup lookup = MethodHandles.lookup(); setField("lookupClass", lookup, T2.class, lookup.getClass()); MethodHandle amh = lookup.findSpecial(T2.class, "a", mt, T2.class); amh.invoke(t); } public static void setField(String name, Object o, Object v, Class c) throws NoSuchFieldException, IllegalAccessException { Field f = c.getDeclaredField(name); f.setAccessible(true); f.set(o, v); }}class T2{ public void a(){ System.out.println("t2"); }}class T3 extends T2{ public void a(){ System.out.println("t3"); }}
暂时这么用着,有时间在研究。。。
阅读全文
0 0
- 代码模拟invokedynamic指令invokevirtual指令调用方法
- invokespecial和invokevirtual两种指令
- Java8学习笔记(2) -- InvokeDynamic指令
- MethodHandle与反射Method区别,invokedynamic指令
- 方法调用指令
- 方法调用指令invoke...
- invokevirtual、invokespecial、invokestatic、invokeinterface、invokedynamic介绍
- Java字节码中invokespecial与invokevirtual指令的解析
- 调用指令
- x86下模拟PPC指令方法
- 给鼠标绑定指令事件,指令调用控制器中方法
- 【汇编】模拟loop指令
- 模拟指令断点
- Java8学习笔记(3) -- InvokeDynamic指令在Groovy里的使用
- invoke*(原有的4中字节码指令)和invokedynamic区别
- 指令
- “%@ %”指令
- #指令
- MQTT Server搭建(apache-apollo)和MQtt Client搭建
- Android插件中使用EventBus出现java.lang.IllegalArgumentException: Expected receiver of type xxx, but got xx
- 初看小程序
- python015 -- 文件
- oh-my-zsh git 慢/卡顿问题解决
- 代码模拟invokedynamic指令invokevirtual指令调用方法
- escape() encodeURI() encodeURIComponent()区别详解
- ASP.NET-常用按钮控件
- 【SDOI省队集训题】棋盘(最小费用流)
- iOS 数组/字典转模型
- Codeforces Round #417 (Div. 2) C. Sagheer and Nubian Market(二分查找)
- 六款值得推荐的android(安卓)开源框架简介
- Yii框架中MongoDB类似In查询
- 打war包/jar包的方法