Java利用MethodHandle实现反射时调用super的method
一:实现
1.Base类的实现
package me.silentdoer.reflecsuper; /**
* @author silentdoer
* @version 1.0
* @description the description
* @date 4/29/18 10:19 AM
*/
public class Base { public String show(long num){
System.out.println("Base" + num);
return "BaseResult";
}
}
2.Test类的实现
package me.silentdoer.reflecsuper; /**
* @author silentdoer
* @version 1.0
* @description the description
* @date 4/29/18 10:20 AM
*/
public class Test extends Base {
@Override
public String show(long num){
System.out.println("Test" + num);
return "TestResult";
}
}
3.main方法所在类的实现
package me.silentdoer.reflecsuper; import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier; /**
* @author silentdoer
* @version 1.0
* @description the description
* @date 4/29/18 10:18 AM
*/
public class Entrance {
public static void main(String[] args) throws Throwable {
MethodHandle h1, h2;
MethodHandles.Lookup lookup = MethodHandles.lookup(); Field allowedModes = MethodHandles.Lookup.class.getDeclaredField("allowedModes");
allowedModes.setAccessible(true);
allowedModes.set(lookup, -1); // 关键,没有这三步的操作findSpecial方法内部this.checkSpecialCaller(specialCaller);会抛异常 // TODO 这里第一个参数表示最终调用的是哪个层级类的某方法,第二个参数则是方法名,第三个参数是返回值类型加参数类型,第四个参数是要调用方法的对象的类型
// TODO findSpecial是准确的要求调用第一个参数类的show方法,尽管调用的对象类是Test,注意最后一个参数的类型即Test必须是extends第一个参数(也可一样)
h1 = lookup.findSpecial(Base.class, "show", MethodType.methodType(String.class, long.class), Test.class);
h2 = lookup.findSpecial(Test.class, "show", MethodType.methodType(String.class, long.class), Test.class); // 用的是同一个对象,但是调用的方法却是不同层级类的show方法
Test foo = new Test();
System.out.println(h1.invoke(foo, 99L));
System.out.println(h2.invoke(foo, 99L));
/* 输出
Base99
BaseResult
Test99
TestResult
*/
}
}
Java利用MethodHandle实现反射时调用super的method的更多相关文章
- java利用注解及反射做通用的入参校验
一.原理: 1.做一个field注解,注解有两个参数:是否必填.toString之后的最大长度 2.对某个request类(或基类),使用注解标记某个字段的校验详情 3.通用的static方法,利用反 ...
- java利用HttpClient进行https接口调用
1.为了避免需要证书,所以用一个类继承DefaultHttpClient类,忽略校验过程. import java.security.cert.CertificateException; import ...
- java利用反射调用类的某个方法
java利用反射机制 可以动态调用某个类的某个方法,在 扩展系统功能或提供对外接口时经常用的到. 代码如下: 打印类Print.java package com.test.reflct; /** * ...
- 利用java反射动态调用方法,生成grid数据
项目中需要java后台查询并组装前台grid的数据,数据行数不定,数据行定义不定,开始用了最原始的方法,写了几百行,就是前台需要什么字段后台拼接什么字段,java代码冗余量非常大,并且不够灵活,一旦前 ...
- 通过JAVA反射,调用未知类的类方法
下面是一个比较简单的通过JAVA的反射机制调用已知方法的例子 package com.togeek.mvntest; import java.lang.reflect.InvocationTarget ...
- Java 反射 方法调用
在使用Java 反射时,对方法的调用,可能碰到最多的问题是,方法的变量如何使用.其实,调用方法的变量全部在参数数组里,不管有多少个参数,你都要把它放在参数数组里,如果是单个非数组参数,则可不使用参数数 ...
- java利用反射获取类的属性及类型
java利用反射获取类的属性及类型. import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.Map ...
- 【转】Java利用反射机制访问私有化构造器
Java利用反射机制访问私有化构造器 博客分类: java 我们都知道,当一个类的构造方法被设为私有的时候(private),在其他类中是无法用new来实例化一个对象的. 但是有一种方法可以把带有 ...
- Java反射机制调用对象的方法 —— 将一个对象的属性值赋值给另一个对象的属性
模拟一个场景: 众所周知,EasyExcel导出Excel文档是依赖于注解完成的,在实体类需要导出的属性上面加上注解,导出的时候会自动识别该属性. 假如我们现在需要导出用户的信息,又不想污染原本的实体 ...
随机推荐
- day 03
1.数字类型 int 数字主要是用于计算用的,使用方法并不是很多,就记住一种就可以: bit_length() 当前十进制用二进制表示时,最少使用的位数 s = 5 print(s.bit_leng ...
- WebApi2跨域问题及解决办法
跨域问题产生的原因 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能.现在所有支持JavaScript的浏览器都会使用这个策略.所谓同源是指,域名,协议, ...
- 我的开发小tip
开发原则:1.谁开发,谁负责到底.自己的开发的模块自己维护,不要让别人替你维护,否则很麻烦:2.合理分配时间3.谨慎的处理遇到的bug和问题,不是自己开发的不要轻举妄动,提交到待办中即可4.万勿过度设 ...
- DevExpress XPO 开发指南 简要
最近在看devexpress 安装程序中的代码Demos .. C:\Users\Public\Documents\DevExpress Demos 16.1\Components\WinFor ...
- Linux_(1)基本命令(上)
一.基本命令1.我是谁 whoami --who am i2.谁在线 who w3.显示当前路径(定位) pwd4.切换目录 cd ~返回主目录 cd ..返回上一级目录5.查看某个目录中的子目录和文 ...
- PHP 文件操作代码
<?php //echo filetype("./1.jpg"); //判断文件类型 文件:file //echo filetype("./code"); ...
- Linux使用touch批量修改文件/文件夹时间戳
Linux下touch是一个非常有用的命令. touch语法结构如下: touch [-acfm][-d <日期时间>][-r <参考文件或目录>][-t <日期时间 ...
- selinux 导致ftp文件夹出错~
关掉selinux #setenforce 0
- Vsphere初试——架设Panabit行为管理
Panabit是目前国内X86平台单板处理能力最高(双向40G).提供免费版本(软件形态),是以DPI为核心优势并发展起来的最专业.上线效果最好.性价比最高的新一代应用网关.Panabit流控引擎,基 ...
- UI设计教程分享:banner设计
我们都知道在一个网站中,banner图片对于浏览者来说是非常重要的,尤其是电商banner,它的最主要目的是营销,是要让消费者有冲动去购买,这对设计的要求也就更高了.而企业网站也一样,一个合适的ban ...