一:实现

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的更多相关文章

  1. java利用注解及反射做通用的入参校验

    一.原理: 1.做一个field注解,注解有两个参数:是否必填.toString之后的最大长度 2.对某个request类(或基类),使用注解标记某个字段的校验详情 3.通用的static方法,利用反 ...

  2. java利用HttpClient进行https接口调用

    1.为了避免需要证书,所以用一个类继承DefaultHttpClient类,忽略校验过程. import java.security.cert.CertificateException; import ...

  3. java利用反射调用类的某个方法

    java利用反射机制 可以动态调用某个类的某个方法,在 扩展系统功能或提供对外接口时经常用的到. 代码如下: 打印类Print.java package com.test.reflct; /** * ...

  4. 利用java反射动态调用方法,生成grid数据

    项目中需要java后台查询并组装前台grid的数据,数据行数不定,数据行定义不定,开始用了最原始的方法,写了几百行,就是前台需要什么字段后台拼接什么字段,java代码冗余量非常大,并且不够灵活,一旦前 ...

  5. 通过JAVA反射,调用未知类的类方法

    下面是一个比较简单的通过JAVA的反射机制调用已知方法的例子 package com.togeek.mvntest; import java.lang.reflect.InvocationTarget ...

  6. Java 反射 方法调用

    在使用Java 反射时,对方法的调用,可能碰到最多的问题是,方法的变量如何使用.其实,调用方法的变量全部在参数数组里,不管有多少个参数,你都要把它放在参数数组里,如果是单个非数组参数,则可不使用参数数 ...

  7. java利用反射获取类的属性及类型

    java利用反射获取类的属性及类型. import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.Map ...

  8. 【转】Java利用反射机制访问私有化构造器

    Java利用反射机制访问私有化构造器 博客分类: java   我们都知道,当一个类的构造方法被设为私有的时候(private),在其他类中是无法用new来实例化一个对象的. 但是有一种方法可以把带有 ...

  9. Java反射机制调用对象的方法 —— 将一个对象的属性值赋值给另一个对象的属性

    模拟一个场景: 众所周知,EasyExcel导出Excel文档是依赖于注解完成的,在实体类需要导出的属性上面加上注解,导出的时候会自动识别该属性. 假如我们现在需要导出用户的信息,又不想污染原本的实体 ...

随机推荐

  1. 使用BulkCopy报错 从 bcp 客户端收到一个对 colid 19 无效的列长度

    ====System.Data.SqlClient.SqlException: 从 bcp 客户端收到一个对 colid 19 无效的列长度. 从0开始数,数据库上表的第19列

  2. js关于去重的写法

    break和continue的区别和作用 break和continue都是用来控制循环结构的,主要是停止循环. 1.break 有时候我们想在某种条件出现的时候终止循环而不是等到循环条件为false才 ...

  3. Failed to read artifact descriptor for xxx:jar的问题解决

    在开发的过程中,尤其是新手,我们经常遇到Maven下载依赖jar包的问题,也就是遇到“Failed to read artifact descriptor for xxx:jar”的错误. 对于这种非 ...

  4. 如何查看Chrome浏览器保存的账号密码

    之前告诉大家如何一键查看所有保存在IE里的所有密码(点击查看原文),现在来告诉大家如何一键查看Chrome浏览器的所有密码.某种意义上上,查看Chrome的密码比查看IE的更简单,因为查看IE密码还需 ...

  5. alv界面透视功能

    bdcdata_wa-fnam = 'P_MONAT-LOW'.               bdcdata_wa-fval = '01'.               APPEND bdcdata_ ...

  6. 微信小程序之 ----API接口

    1. wx.request 接口    可在文件 wxs中操作,连接服务器处理数据    参数    ① url ② data ③ header ④ method ⑤ dataType   回调   ...

  7. Beanstalkd消息队列的安装与使用

    一.Beanstalkd是什么? Beanstalkd是一个高性能,轻量级的分布式内存队列 二.Beanstalkd特性 1.支持优先级(支持任务插队)2.延迟(实现定时任务)3.持久化(定时把内存中 ...

  8. maven项目运行报错invalid LOC header (bad signature)

    切换到项目目录pom.xml文件夹 执行以下命令: mvn test -e -X 找到出错信息 进入目录删除文件. 在ide里面重新部署项目即可.

  9. SD-WAN介绍

    SD-WAN SD-WAN特性 相关技术 Hybrid WAN WAN Optimization WAN edge router MPLS NFV SDN SD-WAN厂商 SD-WAN SD-WAN ...

  10. centos7中输入ifconfig出现ens33,没有eth0(转)

    vmware安装的centos7中没有出现eth0网卡,也没有ip,不能上网,输入ifconfig后如下图 解决办法 1.编辑网卡的配置文件 vi /etc/sysconfig/network-scr ...