iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java接口回调的本质详解
  • 885
分享到

Java接口回调的本质详解

2024-04-02 19:04:59 885人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

本质是JVM指令invokevirtual它涉及到了多态的特性,使用 virtual dispatch 做方法调用 virtual dispatch 机制会首先从 receiver(

本质是JVM指令invokevirtual它涉及到了多态的特性,使用 virtual dispatch 做方法调用

virtual dispatch 机制会首先从 receiver(被调用方法的对象的实际类型)的类的实现中查找对应的方法,如果没找到,则去父类查找,直到找到函数并实现调用,而不是依赖于引用的类型。

我们知道了接口回调的本质是多态,多态的本质是JVM的invokevirtual指令,那么我们就不用拘泥于接口和抽象类或者继承关系这种概念了,我们直接写一个用普通类实现的回调然后再分析它:

public class TestA{
 
    public void A(){
        System.out.println("A");
    }
 
}
public class TestC {
 
    public void C(TestA A){
        System.out.println("ccc1");
        A.A();
        System.out.println("ccc2");
    }
 
}
public class JavaTest {
    public static void main(String[] args) {
 
        TestC testC = new TestC();
 
        testC.C(new TestA(){
            @Override
            public void A() {
                System.out.println("fsf");
            }
        });
    }
}

执行结果:

 如果是invokespecial指令:

public class TestA {
    private void A(){
        System.out.println("A");
    }
}
 
public class TestC {
    public void C(TestA A){
        System.out.println("ccc1");
//注意这里不能用 A.getClass,getClass方法也是用invokevirtual指令调用的
        Class aClass = TestA.class; 
        try {
          Method method = aClass.getDeclaredMethod("A");
          method.setAccessible(true);
          method.invoke(A);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("ccc2");
    }
}
 
public class Test{
 
    public static void main(String[] args) {
        TestC testC = new TestC();
        testC.C(new TestA(){
            private void A() {
                System.out.println("fsf");
            }
        });
    }
 
}

JVM在调用private方法的时候使用的是invokespecial指令,但是我们不能直接在外部调用私有方法所以就写了个反射来调用,执行结果:

如果有因为是不是因为反射导致的,我们排除一下反射:

public class TestA{
    public void A() {
        System.out.println("A");
    }
}
 
public class TestC {
    public void C(TestA A){
        System.out.println("ccc1");
        Class aClass = TestA.class;
        try {
          Method method = aClass.getDeclaredMethod("A");
          method.setAccessible(true);
          method.invoke(A);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("ccc2");
    }
}
 
public class Test{
 
    public static void main(String[] args) {
        TestC testC = new TestC();
        testC.C(new TestA(){
            public void A() {
                System.out.println("fsf");
            }
        });
    }
 
}

执行结果:

使用反射和不使用反射的结果一致可以排除反射的干扰

到此这篇关于Java接口回调的本质详解的文章就介绍到这了,更多相关Java接口回调内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java接口回调的本质详解

本文链接: https://www.lsjlt.com/news/138756.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java接口回调的本质详解
    本质是JVM指令invokevirtual它涉及到了多态的特性,使用 virtual dispatch 做方法调用 virtual dispatch 机制会首先从 receiver(...
    99+
    2024-04-02
  • 基于Java接口回调详解
    目录Java接口回调产生接口回调的场景什么是接口回调在代码中的使用Java接口回调测试接口类实现类回调实现测试Java接口回调 产生接口回调的场景 在现实生活中,产生接口回调的场景很...
    99+
    2024-04-02
  • Java接口的本质解析
    目录接口接口的定义接口和抽象的区别接口的格式接口中的主要成分抽象方法:常量:接口的案例接口与接口的关系JDK8之后的接口新增方法1.含有默认方法和静态方法2.含有私有方法和私有静态方...
    99+
    2024-04-02
  • Java接口的本质实例分析
    本文小编为大家详细介绍“Java接口的本质实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java接口的本质实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。接口Java接口是一系列方法的声明,是一些...
    99+
    2023-06-29
  • Java使用Hutool调用WebService接口详解
    提示:本文显示baidu.com,皆为脱敏用,并非真正地址。 目录 前言 一、WebService是什么? 二、使用步骤 1.验证链接。 2.Soap调用测试 3.获取需要用到的数据 4.Hutool工具类调用 三、示例 1.单个入...
    99+
    2023-09-01
    1024程序员节
  • 澄清Java语言接口与继承的本质(转)
    澄清Java语言接口与继承的本质(转)[@more@]  大多数人认为,接口的意义在于顶替多重继承。众所周知Java没有c++那样多重继承的机制,但是却能够实作多个接口。其实这样做是很牵强的,接口和继承是完全不同的东西,接口没有能力代替多重...
    99+
    2023-06-03
  • 基于Java接口回调的示例分析
    基于Java接口回调的示例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java接口回调产生接口回调的场景在现实生活中,产生接口回调的场景很简单,比如我主动叫你帮我做一件事...
    99+
    2023-06-22
  • Java接口异步调用优化技巧详解
    目录1,自己new线程或者线程池2,Sping Mvc3,修改单个任务为批量任务在日常项目中,我们经常采用多线程异步调用的方式来提高接口的响应时间。 在实际情况下,我们如何通过异步方...
    99+
    2023-05-19
    Java接口异步调用 Java接口调用 Java异步调用
  • Java 回调callback举例详解
    目录前言1、什么是回调2、例子第一章.故事的缘起第二章.幼师的找茬第三章.幼师回来了第四章.门口的婆婆前言 回调的核心就是回调方将本身即this传递给调用方,这样调用方就可以在调用完...
    99+
    2024-04-02
  • Java集合的Collection接口和List接口详解
    目录1集合的概念2 集合的父类Collection接口2.1常用方法2.2遍历 3 List接口3.1List接口常用方法3.2遍历4 集合中元素的去重总结1集合的概念 把...
    99+
    2024-04-02
  • Java8接口中引入default关键字的本质原因详析
    目录接口的常规实现方式接口中的default接口中的staticDefault好处总结接口的常规实现方式 熟悉java接口的同学都知道,接口被某些类实现后,一旦在接口中增加了新方法,...
    99+
    2024-04-02
  • 实例详解Java调用第三方接口方法
    目录一、 通过JDK网络类Java.net.HttpURLConnection1.java.net包下的原生java api提供的http请求2.HttpClientUtil工具类3...
    99+
    2024-04-02
  • Java中Future接口详解
    目录一、背景二、Future接口1、入门案例2、Future接口三、CompletableFuture类1、基础说明2、核心方法2.1 实例方法2.2 计算方法2.3 结果获取方法2...
    99+
    2023-05-16
    Java中Future接口 Java Future
  • java回调机制实例详解
    java回调机制实例详解以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中...
    99+
    2023-05-31
    java 回调机制 ava
  • Java详解ScriptEngine接口动态执行JS脚本
    目录简介Eval(String script)描述实例代码Put() and Get()描述实例代码CompiledScript描述实例代码Bindings描述实例代码大多的方法描述...
    99+
    2022-11-13
    Java ScriptEngine Java 动态执行JavaScript脚本
  • Java中接口的深入详解
    目录一、前言二、接口接口的格式三、接口的特点接口的使用四、类与接口的关系接口多重继承的好处练习总结一、前言 前面我们说了抽象类的概述,我们对抽象类也有个认识和理解了,现在我们学习十分...
    99+
    2024-04-02
  • 如何在java项目中实现接口回调
    这篇文章将为大家详细讲解有关如何在java项目中实现接口回调,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。java 接口回调实例详解首先官方对接口回调的定义是这样的,所谓回调:就是A类中调用...
    99+
    2023-05-31
    java 接口回调 ava
  • Java抽象的本质解析
    目录Java抽象基础知识抽象抽象的定义abstract的使用抽象方法:抽象类:定义抽象类抽象类的一些注意点总结茫茫人海千千万万,感谢这一秒你看到这里。希望我的能对你的有所帮助!共勉!...
    99+
    2024-04-02
  • Java中接口的多态详解
    目录多态参数多态数组接口的多态传递现象总结多态参数 就像我们现实生活中电脑的usb接口,我们既可以接受手机对象,又可以接受相机对象,等等,体现了接口的多态,查看以下代码 接口: pa...
    99+
    2024-04-02
  • 接口回调的概念和典型例程(java和kotlin)
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、什么是接口回调?二、为什么要使用接口回调三、在JAVA和kotlin中几个接口回调的实例1.java实例2.kotlin实例 三、总结 ...
    99+
    2023-12-22
    android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作