源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Java反射之Call stack introspection详解

  • 时间:2020-05-07 01:00 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Java反射之Call stack introspection详解
java是基于栈设计的语言,其实与C、C++语言相同。整个程序的运行表现在方法的执行是一系列入栈出栈的行为,栈是线程私有的。 在java语言中,我们可以跟踪方法的调用关系,即当前栈帧(栈顶)和已经入栈的栈帧的层次关系。 从java1.4以后,java语言的Throwable类提供了以下方法:
OpenDeclarationStackTraceElement[]java.lang.Throwable.getStackTrace()
ProvidesprogrammaticaccesstothestacktraceinformationprintedbyprintStackTrace().Returnsanarrayofstacktraceelements,eachrepresentingonestackframe.Thezerothelementofthearray(assumingthearray'slengthisnon-zero)representsthetopofthestack,whichisthelastmethodinvocationinthesequence.Typically,thisisthepointatwhichthisthrowablewascreatedandthrown.Thelastelementofthearray(assumingthearray'slengthisnon-zero)representsthebottomofthestack,whichisthefirstmethodinvocationinthesequence.
Somevirtualmachinesmay,undersomecircumstances,omitoneormorestackframesfromthestacktrace.Intheextremecase,avirtualmachinethathasnostacktraceinformationconcerningthisthrowableispermittedtoreturnazero-lengtharrayfromthismethod.Generallyspeaking,thearrayreturnedbythismethodwillcontainoneelementforeveryframethatwouldbeprintedbyprintStackTrace.Writestothereturnedarraydonotaffectfuturecallstothismethod.
Returns:
anarrayofstacktraceelementsrepresentingthestacktracepertainingtothisthrowable.
Since:
1.4
该方法返回的StackTraceElement[] 就是栈帧数组。数组下标0的元素代表当前栈顶栈帧,数组的最大下标代表调用栈序列中第一个栈帧,也就是第一个方法的调用。我们可以从StackTraceElement得到栈调用层级的关系、调用方法名及调用入口位置,代码示例: [img]http://files.jb51.net/file_images/article/201711/20171115160750168.png?201710151686[/img] 执行结果: [img]http://files.jb51.net/file_images/article/201711/20171115160853241.png?201710151695[/img] 调用结果显示的方法调用层级关系。 那我们得到这些信息有什么用呢。 1.日志:这些信息可以让应用的日志系统得到信息更详细。 2.安全:API可以决定调用者当前包或者类是否有权限进入。 3.流程控制:可以避免一些流程错误,比如无限递归调用。 实现一个简单的日志系统:
package com.doctor.reflect;
import java.io.PrintWriter;
import java.io.StringWriter;
/**
 * Call stack introspection
 * 
 * @author sdcuike
 *
 *     Created At 2016年8月29日 下午9:40:35
 */
public class CallStackIntrospectionDemo {
 private static final MyLogger logger = new LoggerImpl();
 public static void main(String[] args) {
  logger.logRecord("hello");
  IllegalArgumentException exception = new IllegalArgumentException("IllegalArgumentException");
  logger.logProblem("throwable", exception);
 }
 public interface MyLogger {
  // Types for log records
  int ERROR  = 0;
  int WARNING = 100;
  int STATUS = 200;
  int DEBUG  = 300;
  int TRACE  = 400;
  void logRecord(String message);
  void logProblem(String message, Throwable throwable);
 }
 public static class LoggerImpl implements MyLogger {
  @Override
      public void logRecord(String message) {
   Throwable throwable = new Throwable();
   log(message, throwable.getStackTrace()[1]);
  }
  @Override
      public void logProblem(String message, Throwable throwable) {
   StringWriter out = new StringWriter();
   PrintWriter writer = new PrintWriter(out);
   throwable.printStackTrace(writer);
   writer.flush();
   log(message + out.toString(), throwable.getStackTrace()[0]);
  }
  private void log(String message, StackTraceElement stackTraceElement) {
   String className = stackTraceElement.getClassName();
   String methodName = stackTraceElement.getMethodName();
   int lineNumber = stackTraceElement.getLineNumber();
   System.out.println(String.join(" ", "模拟打印日志:", methodName, className, "" + lineNumber, message));
  }
 }
}
执行结果:
模拟打印日志: main com.doctor.reflect.CallStackIntrospectionDemo 36 hello
模拟打印日志: main com.doctor.reflect.CallStackIntrospectionDemo 38 throwablejava.lang.IllegalArgumentException: IllegalArgumentException
  at com.doctor.reflect.CallStackIntrospectionDemo.main(CallStackIntrospectionDemo.java:38)
上述日志,只是简单的在控制台打印一些信息。 [b]总结[/b] 以上就是本文关于Java反射之Call stack introspection详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站: [url=http://www.1sucai.cn/article/128100.htm][b]Java反射简易教程[/b][/url] [url=http://www.1sucai.cn/article/124190.htm][b]关于Java反射机制 你需要知道的事情[/b][/url] [url=http://www.1sucai.cn/article/124085.htm][b]Java的RTTI和反射机制代码分析[/b][/url] 如有不足之处,欢迎留言指出。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部