caller callee c语言 函数调用_Java invoke

caller callee c语言 函数调用_Java invoke1、什么是JVM?JVM本质上就是一个软件,是计算机硬件的一层软件抽象,在这之上才能够运行Java程序,JAVA在编译后会生成类似于汇编语言的JVM字节码,与C语言编译后产生的汇编语言不同的是,C编译成的汇编语言会直接在硬件上跑,但JAVA编译后生成的字节码是在J今天在遇到个问题,如何在callee中获取caller的信息?搜索了一下,java提供一种如下的方法:StackTraceElemen…

1、什么是JVM? JVM本质上就是一个软件,是计算机硬件的一层软件抽象,在这之上才能够运行Java程序,JAVA在编译后会生成类似于汇编语言的JVM字节码,与C语言编译后产生的汇编语言不同的是,C编译成的汇编语言会直接在硬件上跑,但JAVA编译后生成的字节码是在J

今天在遇到个问题,如何在callee中获取caller的信息?

搜索了一下,java提供一种如下的方法:

StackTraceElement stack[] = (new Throwable()).getStackTrace();

即可获得相应的调用栈中的信息。

方法其实类似new 一个Exception ,然后printStackTrace…….

但是有大牛说这是一个不精确的方法,java并未保证可以获取caller信息的完整;

看到这个题目,很多人会觉得我写我的java代码,至于类,JVM爱怎么加载就怎么加载,博主有很长一段时间也是这么认为的。随着编程经验的日积月累,越来越感觉到了解虚拟机相关要领的重要性。闲话不多说,老规矩,先来一段代码吊吊胃口。 public class SSClass{

查阅了Java文档说明:

getStackTrace

public StackTraceElement[] getStackTrace()

Provides programmatic access to the stack trace information printed by

printStackTrace(). Returns an array of stack trace elements, each representing one stack frame. The zeroth element of the array (assuming the array’s length is non-zero) represents the top of the stack, which is the last method invocation in the sequence. Typically, this is the point at which this throwable was created and thrown. The last element of the array (assuming the array’s length is non-zero) represents the bottom of the stack, which is the first method invocation in the sequence.

Some virtual machines may, under some circumstances, omit one or more stack frames from the stack trace. In the extreme case, a virtual machine that has no stack trace information concerning this throwable is permitted to return a zero-length array from this method. Generally speaking, the array returned by this method will contain one element for every frame that would be printed by printStackTrace.

Returns:

an array of stack trace elements representing the stack trace pertaining to this throwable.

Since:

1.4

注意红色部分:某些虚拟机在一些情况下,会省略一个或多个栈信息;而甚至在某些极端case里,这个方法甚至返回一个长度为零的数组;

可见,不可以使用这种方法来保证程序的正确运行,特别是需要根据caller来进行判断处理的需求,在这种情况下只能考虑其他的方法(譬如caller在调用前传递活着设置相关信息);

那这个方法有什么用?或许在进行调试或者Log的时候可以吧?还需要调查一番。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/214262.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java数据结构与算法(10) – ch05链表实现队列(Link Queue)

    Java数据结构与算法(10) – ch05链表实现队列(Link Queue)

    2021年9月2日
  • 使用tcping命令ping指定端口「建议收藏」

    使用tcping命令ping指定端口「建议收藏」ping是简单的测试网络连接情况的小工具,对于一般用户很实用,但是ping有个缺点就是,不能指定端口,同时如果源地址禁ping的话,ping命令就形同虚设。——前言tcping命令是针对tcp监控的,也可以看到ping值,即使源地址禁ping也可以通过tcping来监控服务器网络状态,除了简单的ping之外,tcping最大的一个特点就是可以指定监控的端口。tcping命令使用方法很简单下载

    2022年6月23日
  • 小程序面试题及答案2019_小程序面试问的技术点

    小程序面试题及答案2019_小程序面试问的技术点文档描述本文是关注微信小程序的开发和面试问题,由基础到困难循序渐进,适合面试和开发小程序。并有热点框架(vuereactnode.js全栈)前端资源以及后端视频资源和源码并基于前端进阶和面试的需求总结了常用插件和js算法以及html/css和js热点面试题因为csdn不可以有外链所以答案链接在评论区!!!Vue面试题生命周期函数面试题1.什么是…

    2022年8月29日
  • acwing-个简单的整数问题2(线段树+懒惰标记)「建议收藏」

    acwing-个简单的整数问题2(线段树+懒惰标记)「建议收藏」原题链接给定一个长度为 N 的数列 A,以及 M 条指令,每条指令可能是以下两种之一:C l r d,表示把 A[l],A[l+1],…,A[r] 都加上 d。Q l r,表示询问数列中第 l∼r 个数的和。对于每个询问,输出一个整数表示答案。输入格式第一行两个整数 N,M。第二行 N 个整数 A[i]。接下来 M 行表示 M 条指令,每条指令的格式如题目描述所示。输出格式对于每个询问,输出一个整数表示答案。每个答案占一行。数据范围1≤N,M≤105,|d|≤10000,|A[

    2022年8月8日
  • 5G NR SSB概述[通俗易懂]

    5G NR SSB概述[通俗易懂]       SSB(SynchronizationSignal/PBCH,同步广播块)是5G中使用的最重要的导频信道之一,其作用关系到UE接入小区的很多方面,如小区搜索、波束测量、波束选择、波束恢复等。1、SSB时频域结构       在5G中,SSB包括同步信号和广播信号,具体同步信号包括PSS(PrimarySynchronizationSignal,

    2022年6月29日
  • 两位数活多位乘法的计算编程

    两位数活多位乘法的计算编程代码编写;OptionBase1PrivateSubCommand1_Click()DimMAsStringDimNAsStringM=Trim(Text1.Text)N=Trim(Text2.Text)DimNumber1()AsByteDimNumber2()AsByteReDimNumber1(Len(M))R

    2022年5月6日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号