一:实现

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. Eclipse插件安装常见方法

    Eclipse插件的安装方法大体有以下几种: 第一种:直接复制法 假设Eclipse的安装目录在C:\eclipse,解压下载的eclipse 插件或者安装eclipse 插件到指定目录文件夹,打开安 ...

  2. maven library has broken path和pom jar包导入失败

    今天在打开项目的时候,在pom文件添加新的依赖文件发现很多jar都标红,显示不存在,自己查了一上午各种尝试,总结了以下的解决方法. 首先你打开File-Project Structrue-Module ...

  3. 直接提交一个form表单后台返回一个新页面通过target属性可以放到iframe当中

    问题描述: 我想提交一个form表单后台直接返回一个新页面,但是当前页面还不想被替换掉: 解决方案: 在页面中添加一个iframe将form表单的target属性设置为iframe的id这样的话返回的 ...

  4. React-router4 笔记

    第一次看React-router发现根据阮一峰老师教程老报错,,完全一样的代码还是报错,,然而到最后才发现自己安装的版本太高了! 由于菜鸟比较新,npm install react-router 这样 ...

  5. 从django的序列化到rest-framework 序列化

    1.利用Django的view实现返回json数据 from django.views.generic import View from goods.models import Goods class ...

  6. Oracle性能优化2- 依据场景选择技术

    1.索引的坏处 索引可以加快查询效率,但是使用不当,会造成插入性能很低 drop table test1 purge; drop table test2 purge; drop table test3 ...

  7. c# mac地址 和http://xx.xx.xx/ 正则表达式匹配

    Mac  :^([0-9a-fA-F]{2})(([/\s:][0-9a-fA-F]{2}){5})$ C# 书写方式 一下是允许mac中间间隔符是“:”或者“-”两种输入方式 并且我把上边的正则表达 ...

  8. 5O - 产生冠军

    有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛. 球赛的规则如下: 如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打败C. 如果A打败了B,B又打败了 ...

  9. 20172306 《Java程序设计与数据结构》第七周学习总结

    20172306<Java程序设计>第七周学习总结 教材学习内容总结 这一章的标题是继承.主要学习了有关继承的相关知识.其中在这五节中,我学到了以下几点: 1.继承主要表达的是" ...

  10. Arithmetic Slices II - Subsequence LT446

    446. Arithmetic Slices II - Subsequence Hard A sequence of numbers is called arithmetic if it consis ...