精华内容
下载资源
问答
  • 本文的目的并不是介绍使用的什么技术,而是重点阐述回调接口其实现原理。一、 异步和同步讲通俗点,异步就是不需要等当前执行的动作完成,就可以继续执行后面的动作。通常一个程序执行的顺序是:从上到下,依次执行...

    本文的目的并不是介绍使用的什么技术,而是重点阐述回调接口其实现原理。

    一、 异步和同步

    讲通俗点,异步就是不需要等当前执行的动作完成,就可以继续执行后面的动作。

    通常一个程序执行的顺序是:从上到下,依次执行。后面的动作必须等前面动作执行完成以后方可执行。这就是和异步相对的一个概念——同步。

    案例:

    A、张三打电话给李四,让李四帮忙写份材料。

    B、李四接到电话的时候,手上有自己的工作要处理,但他答应张三,忙完手上的工作后马上帮张三写好材料,并传真给张三。

    C、通完电话后,张三外出办事。

    说明:

    张三给李四通完电话后,就出去办事了,他并不需要等李四把材料写好才外出。那么张三让李四写材料的消息就属于异步消息。

    相反,如果张三必须等李四把材料写好才能外出办事的话,那么这个消息就属于同步消息了。

    二、 异步的实现

    传统的程序执行代码都是从上到下,一条一条执行的。

    但生活中有很多情况并不是这样,以上的案例中,如果李四需要几个小时以后才能帮张三写好材料的话,那张三就必须等几个小时,这样张三可能会崩溃或者抓狂。

    这种一条龙似的处理,显示不太合理。

    可以使用以下办法来处理这种问题:

    张三找王五去给李四打电话,等李四写好材料后,由王五转交给张三。这样张三就可以外出办其他的事情了。

    问题得到了合理的解决,之前张三一条线的工作,由张三和王五两条线来完成了,两边同时进行,彼此不耽误。

    三、 计算机语言的实现

    办法有了,如何用程序来模拟实现呢?

    A、以前由一个线程来处理的工作,可以通过新增一个线程来达到异步的目的。这也就是JAVA中的多线程技术。

    B、最后李四写好的材料必须交给张三,以做他用。这就是回调。

    回调你可以这样来理解:

    A发送消息给B,B处理好A要求的事情后,将结果返回给A,A再对B返回的结果来做进一步的处理。

    四、 Java代码的实现

    A、回调的实现

    1 /**

    2 * 回调接口3 *@author节奏4 *5 */

    6 public interfaceCallBack {7 /**

    8 * 执行回调方法9 *@paramobjects 将处理后的结果作为参数返回给回调方法10 */

    11 public voidexecute(Object... objects );12 }

    Java是面向对象的语言,因此回调函数就变成了回调接口。

    B、消息的发送者

    1 /**

    2 * 简单本地发送异步消息的类3 *@author节奏4 *5 */

    6 public class Local implementsCallBack,Runnable {7

    8 /**

    9 * 远程接收消息的类,模拟point-to-point10 */

    11 privateRemote remote;12

    13 /**

    14 * 发送出去的消息15 */

    16 privateString message;17

    18 publicLocal(Remote remote, String message) {19 super();20 this.remote =remote;21 this.message =message;22 }23

    24 /**

    25 * 发送消息26 */

    27 public voidsendMessage() {28 /**当前线程的名称**/

    29 System.out.println(Thread.currentThread().getName());30 /**创建一个新的线程发送消息**/

    31 Thread thread = new Thread(this);32 thread.start();33 /**当前线程继续执行**/

    34 System.out.println("Message has been sent by Local~!");35 }36

    37 /**

    38 * 发送消息后的回调函数39 */

    40 public voidexecute(Object... objects ) {41 /**打印返回的消息**/

    42 System.out.println(objects[0]);43 /**打印发送消息的线程名称**/

    44 System.out.println(Thread.currentThread().getName());45 /**中断发送消息的线程**/

    46 Thread.interrupted();47 }48

    49 public static voidmain(String[] args) {50 Local local = new Local(new Remote(), "Hello");51

    52 local.sendMessage();53 }54

    55 public voidrun() {56 remote.executeMessage(message, this);57

    58 }59 }

    C、远程消息的接收者

    1 /**

    2 * 处理消息的远程类3 *@author节奏4 *5 */

    6 public classRemote {7

    8 /**

    9 * 处理消息10 *@parammsg 接收的消息11 *@paramcallBack 回调函数处理类12 */

    13 public voidexecuteMessage(String msg,CallBack callBack) {14 /**模拟远程类正在处理其他事情,可能需要花费许多时间**/

    15 for(int i=0;i<1000000000;i++) {16

    17 }18 /**处理完其他事情,现在来处理消息**/

    19 System.out.println(msg);20 System.out.println("I hava executed the message by Local");21 /**执行回调**/

    22 callBack.execute(new String[]{"Nice to meet you~!"});23 }24

    25 }

    executeMessage()方法需要接收一个message参数,表示发送出去的消息; 而CallBack参数是他自己,也就是这里的this。表示发送消息后,由Local类自己来处理,调用自身的execute      方法来处理消息结果。

    如果这里不是用this,而是用其他的CallBack接口的实现类的话,那就不能称之为“回调”了,在OO的世界里,那就属于“委派”。也就是说:“回调”必须是消息的发送者来处理消息结果,否则不能称之为回调。这个概念必须明确。

    展开全文
  • 原标题:一步步解析java执行内幕对于任何一门语言,要想...每一步又是怎么执行的?执行原理又是什么?.....当然,本篇文章的粒度可能稍微侧重于宏观方面,更细粒度的技术分析,需要在接下来的该系列文章中与大家分...

    原标题:一步步解析java执行内幕

    对于任何一门语言,要想达到精通的水平,研究它的执行原理(或者叫底层机制)不失为一种良好的方式。在本篇文章中,将重点研究java源代码的执行原理,即从程序员编写JAVA源代码,到最终形成产品,在整个过程中,都经历了什么?每一步又是怎么执行的?执行原理又是什么?.....

    当然,本篇文章的粒度可能稍微侧重于宏观方面,更细粒度的技术分析,需要在接下来的该系列文章中与大家分享....

    348ce113f8c9716b458a3cfded8efe39.png

    一 编写java源程序

    java源文件:指存储java源码的文件;

    当前比较主流的JAVA IDE?

    (1)Intellij IDEA(首推荐)

    (2)Eclipse

    先来看看如下代码:

    //MyTest被public修饰,故存储该java源码的文件名为MyTest

    publicclassMyTest{

    publicstaticvoidmain(String[] args){

    System. out.println( "Test Java execute process.");

    }

    }

    //由于MyTest被public修饰了,故Class A不能用public修饰

    classA{}

    //由于MyTest被public修饰了,故Class B不能用public修饰

    classB{}

    (1)java源文件名就是该源文件中public类的名称

    (2)一个java源文件可以包含多个类,但只允许一个类为public

    二 编译java源代码

    当java源程序编码结束后,就需要编译器编译,安装好jdk后,我们打开jdk目录,有两个.exe文件,即javac.exe(编译源代码,即.java文件)和java.exe(执行字节码,即.class文件)

    5abe447557793a09381fafc6b0f18f3c.png

    1.切换到MyTest.java文件夹

    2.javac.exe编译MyTest.java

    编译后,发现e:Blogs 目录多了以class为后缀的文件:A.class,B.class和MyTest.class

    4d3de4a0b2e8805962d43a7db019049e.png

    Tip:当javac.exe编译java源代码时,java源代码有几个类,就会编译成一个对应的字节码文件(.class文件),其中,字节码文件的文件名就是每个类的类名。需要注意的是,类即使不在源文件中定义,但被源文件引用,编译后,也会编程相应的字节码文件,如类A引用类C,但类C不定义在类A的源文件中,编译后,类C也被编译成对应的字节码文件C.class

    三 执行java源文件

    执行java源文件,用java.exe执行即可

    到现在,java源程序基本执行结果,并正确打印我们期望的结果,那么,如上的步骤,我们可以总结如下:

    694c178e6b2bfae01ac248ffbac77854.png

    如上总结,已经抽象化了在JVM中的执行,接下来,我们将分析,字节码文件(.calss文件)如何在虚拟机中一步一执行的。

    四 JVM如何执行字节码文件

    (一) 装载字节码文件

    当.java源码被javac.exe编译器编译成.class字节码文件后,接下来的工作就交给JVM处理,JVM首先通过类加载器(ClassLoader)将class文件和相关Java API加载装入JVM,以供JVM后续处理。

    在该阶段中,涉及到如下一些基本概念和知识。

    1.JDK,JRE和JVM关系

    (1)JDK(Java Development Kit),Java开发工具包,主要用于开发,在JDK7前,JDK包括JRE

    (2)JRE(Java Runtime Environment),Java程序运行的核心环境,包括JVM和一些核心库

    (3)JVM(Java Virtual Machine),VM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的,是JRE核心模块。

    2.JVM

    JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机虚拟机的主要任务是装载class文件并执行其中的字节码,不同的Java虚拟机中,执行引擎可能由不同的实现,大致有如下几种引擎:

    一次性解释字节码引擎

    即时编译引擎

    自适应优化器

    关于虚拟机的实现方式,采用软件方式、硬件方式和软件硬件结合方式,这个要根据具体厂商而定。

    3.什么是ClassLoader

    虚拟机的主要任务是装载class文件并执行其中的字节码,而class文件是由虚拟机的类加载器(ClassLoader)完成的,在一个Java虚拟机,有可能存在多个类加载器。

    任何java运用程序,可能会使用两种类加载器,即启动类加载器(bootstrap)和用户自定义类加载器。

    启动类加载器是Java虚拟机唯一实现的一部分,它又可分为原始类装载器,系统类装载器或默认类装载器,它的主要作用是从操作系统的磁盘装载相应的类,如Java API类等。

    用户自定义装载类,按照用户自定义的方式来装载类。

    5df265001c44693e0794218cdb1d6899.png

    (二)将字节码文件存储在JVM内存区

    当JAVA虚拟机运行一个程序时,它需要内存来存储许多东西,如字节码,从已装载的class文件中得到的其他信息,程序创建的对象,传递给方法的参数,返回值,局部变量以及运算的中间结果等,这些相关信息被组织到“运行时数据区”。

    根据厂商的不同,在Java虚拟机中,运行时数据区也有所不同,有些运行时数据区由线程共享,有些只能由某个特定线程共享。运行时数据区大致可分几个区:方法区,堆区,栈区,PC寄存器区和本地方法栈区。

    在该阶段中,涉及到如下基本概念和知识。

    1.方法区

    方法区用来存储解析被加载的class文件的相关信息。当虚拟装载一个class文件后,它会从这个class文件包含的二进制数据中解析类型信息,然后将该相关信息存储到方法区中。

    2.堆

    堆是用来存储相关引用类型的,如new对象。当程序运行时,虚拟机会把所有该程序在运行时创建的对象都放到堆中。

    3.PC寄存器

    PC寄存器主要用来存储线程。当新创建一个线程时,该线程都将得到一个自己的PC寄存器(程序计数器)以及一个java栈。Java虚拟机没有寄存器,其指令集使用Java栈来存储中间数据。

    4.栈区

    栈区主要用来存储值类型的,如基本数据类型,需要注意的时,String为引用类型,是存在堆中的。Java栈是由许多栈帧组成的,一个栈帧包含一个Java方法调用的状态,当线程调用一个方法时,虚拟机压入一个新的栈帧到该线程的Java栈中当该方法返回时,这个栈帧从Java栈中弹出。

    f2ba01828b1b1816fe9c699a917e344c.png

    (三)执行引擎与运行时数据区交互

    运行时数据区为执行引擎提供了执行环境和相关数据,执行引擎通过与运行时数据区交互,从而获取执行时需要的相关信息,存储执行的中间结果等

    88e2c331c2b945ad3e966cd0802e43b4.png

    (四)执行引擎与本地方法接口

    当要执行本地方法时,执行引擎将调用本地方法接口来获取相关OS本地方法,需要注意的是,本地方法与操作系统强耦合的。

    983e4932c74b311f04651d77652227d1.png

    (五)JVM在具体操作系统上执行

    JVM通过调用本地接口来获取本地方法,从而实现在具体的平台上执行,如在Linux系统上执行,在Window系统上执行和在Unix系统上执行。

    ead95764dde8f8ee7ece75a97443f1b5.png

    五 参考文献

    【01】深入Java虚拟机(原书第2版)(美)Bill Venners 著

    【02】Core Java Volume I - Fundamententals(10th Edition) (美) Cay S.Horstmann

    【03】Core Java Volume I - Advanced Features(10th Edition) (美) Cay S.Horstmann

    作者:wangjiming

    来源:https://www.cnblogs.com

    /wangjiming/p/10455993.html返回搜狐,查看更多

    责任编辑:

    展开全文
  • 监听器主要针对三个对象ServletContextHttpSessionServletRequest使用方式创建*Listener接口的实现类在web.xml中注册该类在同时注册多个同接口的监听器时,执行顺序参照web.xml中的注册顺序监听器监听类型对象的创建...

    监听器主要针对三个对象

    ServletContext

    HttpSession

    ServletRequest

    使用方式

    创建*Listener接口的实现类

    在web.xml中注册该类

    在同时注册多个同接口的监听器时,执行顺序参照web.xml中的注册顺序

    监听器监听类型

    对象的创建和销毁

    对象属性的添加、替换、移除

    创建实现类

    // 用于监听session创建和销毁的监听器

    package listener;

    import javax.servlet.http.HttpSessionEvent;

    import javax.servlet.http.HttpSessionListener;

    public class SessionListener implements HttpSessionListener {

    @Override

    public void sessionCreated(HttpSessionEvent httpSessionEvent) {

    // 获取本次事件创建session的id

    String sessionId = httpSessionEvent.getSession().getId();

    System.out.println("create session that id = " + sessionId);

    }

    @Override

    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {

    // 删除session的id

    String sessionId = httpSessionEvent.getSession().getId();

    System.out.println("session has been destroy that id = " + sessionId);

    }

    }

    在web.xml中注册

    xmlns="http://xmlns.jcp.org/xml/ns/javaee"

    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"

    id="WebApp_ID" version="3.1">

    Archetype Created Web Application

    index.jsp

    listener.SessionListener

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。

    展开全文
  • 1、下载soap2、解压到c:\gsoap-2.73、将c:\gsoap-2.7下的soapcpp2.exe,wsdl2h.exe,stdsoap2.h,stdsoap2.cpp拷贝到C:\wstest\client\gsoap2.7目录下4、在C:\wstest\client\gsoap2.7目录下执行soapcpp2 -C -x test.h ...

    1、下载soap

    2、解压到c:\gsoap-2.7

    3、将c:\gsoap-2.7下的soapcpp2.exe,wsdl2h.exe,stdsoap2.h,stdsoap2.cpp拷贝到C:\wstest\client\gsoap2.7目录下

    4、在C:\wstest\client\gsoap2.7目录下执行soapcpp2 -C -x test.h -I "C:/gsoap-2.7/gsoap/import"

    5、在C:\wstest\client\gsoap2.7目录下执行wsdl2h -I "C:/gsoap-2.7/gsoap/WS" -s

    -o test.h http://192.168.81.191:5000/....../CWSCrm.asmx?wsdl

    6、将C:\wstest\client\gsoap2.7目录下文件拷贝到C:\wstest\client\test\目录下

    7、新建立qt5项目,test.pro文件:

    QT += core gui

    QT +=network

    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

    TARGET = test

    TEMPLATE = app

    SOURCES += main.cpp\

    mainwindow.cpp \

    stdsoap2.cpp \

    soapC.cpp \

    soapClient.cpp

    HEADERS += mainwindow.h \

    stdsoap2.h \

    soapH.h \

    stdsoap2.h \

    soapStub.h

    FORMS += mainwindow.ui

    LIBS += -L . -l ws2_32

    mainwindow.cpp

    #include "mainwindow.h"

    #include "ui_mainwindow.h"

    #include

    #include "CWSCrmSoap.nsmap"

    #include "soapCWSCrmSoapProxy.h"

    #include "soapH.h"

    wsdl2h常用选项

    -o 文件名,指定输出头文件

    -n 名空间前缀 代替默认的ns

    -c 产生纯C代码,否则是C++代码

    -s 不要使用STL代码

    -t 文件名,指定type map文件,默认为typemap.dat

    -e 禁止为enum成员加上名空间前缀

    soapcpp2常用选项

    -C 仅生成客户端代码

    -S 仅生成服务器端代码

    -L 不要产生soapClientLib.c和soapServerLib.c文件

    -c 产生纯C代码,否则是C++代码(与头文件有关)

    -I 指定import路径

    -x 不要产生XML示例文件

    -i 生成C++包装,客户端为xxxxProxy.h(.cpp),服务器端为xxxxService.h(.cpp)。

    展开全文
  • webservice可访问,已访问到接口方法,参数和返回值都是string类型的。就是最后执行该方法时报错”Fault occurred while processing“。 无论静态添加web引用或服务引用,还是代码动态添加,都是一样的错。动态调用...
  • RequestParamRequestParam会获取url链接上面的参数内容,然后获取匹配的参数作为接口参数传递给方法执行逻辑。如果请求的参数和接口方法参数名称一致,可以不需要显式使用该注解,例子如下:packa...
  • Java中线程执行的任务接口java.lang.Runnable 要求不抛出Checked异常,publicinterfaceRunnable{publicabstractvoidrun();}那么如果 run() 方法中抛出了RuntimeException,将会怎么处理了?通常java.lang.Thread对象...
  • Java中线程执行的任务接口java.lang.Runnable 要求不抛出Checked异常, publicinterfaceRunnable{publicabstractvoidrun();}那么如果 run() 方法中抛出了RuntimeException,将会怎么处理了?通常java.lang.Thread...
  • 太懒,不多说看图,mybatis-generator工具执行后的项目结构 这个时候没得额service接口类,和service实现类,也没的controller类执行引擎工具类BeanGenerateUtil后结果 可以看见自动创建了包,和service接口类,和...
  • 掌握操作符、控制执行流程、访问权限控制、复用类、多态、接口、字符串、泛型、数组、容器深入研究、JavaI/O系统、枚举类型、并发以及图形化用户界面等内容。Java编程语言,掌握一种文本编辑器,比如Vim, Emacs, ...
  • Java中线程执行的任务接口java.lang.Runnable 要求不抛出Checked异常,publicinterfaceRunnable{publicabstractvoidrun();}那么如果 run() 方法中抛出了RuntimeException,将会怎么处理了?通常java.lang.Thread对象...
  • 简介WeTest是处理API接口测试的轻量级自动化测试框架,java语言实现,拓展JUnit4开源框架,支持Ant/Maven执行方式。工具特点:1.支持suite,根据JUnit4测试类名正则匹配,聚合相同模块的用例,运行单个聚合类即可...
  • 线程安全问题1.1在 Java 中,有多种方式来实现多线程。继承 Thread 类、实现 Runnable 接口、使用 ExecutorService、Callable、Future 实现带返回结果的多线程以及线程池。继承 Thread 类创建线程Thread 类本质上是...
  • Java中线程执行的任务接口java.lang.Runnable 要求不抛出Checked异常,publicinterfaceRunnable{publicabstractvoidrun();}那么如果 run() 方法中抛出了RuntimeException,将会怎么处理了?通常java.lang.Thread对象...
  • java中的东岱代理机制是动态生成代理接口的实例类,在代理类的invoke方法中可以在实际方法执行时做用户自定义的一些操作,spring中的aop就是用这个原理来执行的。 先看看普通的动态代理是怎么使用的。 1、先声明一...
  • java包一、java常用包1. 常用包介绍java.lang java的核心类,提供常用功能,如:String、Math、System等。...java.net 包含执行与网络相关操作的类和接口。jave.text 包含一些格式化相关的类。ja...
  • 初学Java,面向接口编程,命令模式(十八)

    千次阅读 热门讨论 2012-02-08 22:02:02
    命令模式允许请求的一方和发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否执行,何时被执行以及是怎么执行的。系统支持命令的撤消。命令模式就像是把...
  • 捕获Java线程池执行任务抛出的异常Java中线程执行的任务接口java.lang.Runnable 要求不抛出Checked异常, public interface Runnable { public abstract void run(); } 那么如果 run() 方法中抛出了...
  • java笔记--什么是接口回调,怎么

    千次阅读 2016-02-25 14:51:36
     所谓回调就是A类中设置一个方法b给对象C,C可以执行A中的方法b。通常这个方法是定义在C对象中的接口中的抽象方法, A设置的时候直接设置这个接口对象即可。 如何定义一个回调 a. 定义接口 : 在类中定义一个...
  • java开发接口利用http协议传输数据

    千次阅读 2018-01-16 21:31:01
    java开发接口利用http协议传输数据 这个接口主要用来登录,java服务器提供一个接口,移动设备客户端(android和ios)能通过这个接口把用户名和密码之类的东东传过来到服务器验证,然后服务器返回数据...接口执行
  • java接口的初始化

    千次阅读 2018-10-06 12:04:27
    真正不同的地方在于第三点,类的初始化执行之前要求父类全部都初始化完成了,但接口的初始化貌似对父接口的初始化不怎么感冒。 也就是说,子接口初始化的时候并不要求其父接口也完成初始化,只有在真正使用到父接口...
  • 调用和回调机制在一个应用系统中, 无论使用何种语言开发, 必然存在模块之间的... 这种调用方式适用于方法b()执行时间不长的情况, 因为b()方法执行时间一长或者直接阻塞的话, a()方法的余下代码是无法执行下去的, ...
  • 命令模式允许请求的一方和发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否执行,何时被执行以及是怎么执行的。系统支持命令的撤消。 命令模式就像...
  • 在计算机程序设计中, 回调函数 ,简称 回调 (Callback),是指通过函数参数传递到其他代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。以上是维基百科对“回调函数”的定义。对于回...
  • 一、摘要现实交易中为了能及时了解发明者量化机器人交易状态,有时候我们需要将机器人所执行的交易结果发送到微信、邮箱、短信等等。但每天上百条各种各样的信息,使得对这些信息已经不敏感,导致重要的信息不能及时...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 724
精华内容 289
关键字:

java怎么执行接口

java 订阅