国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java反射之Call stack introspection詳解

Java反射之Call stack introspection詳解

2021-02-05 12:12Beaver Java教程

這篇文章主要介紹了Java反射之Call stack introspection詳解,具有一定參考價值,需要的朋友可以了解下。

java是基于棧設計的語言,其實與c、c++語言相同。整個程序的運行表現在方法的執行是一系列入棧出棧的行為,棧是線程私有的。

在java語言中,我們可以跟蹤方法的調用關系,即當前棧幀(棧頂)和已經入棧的棧幀的層次關系。

從java1.4以后,java語言的throwable類提供了以下方法:

?
1
2
3
4
5
6
7
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得到棧調用層級的關系、調用方法名及調用入口位置,代碼示例:

Java反射之Call stack introspection詳解

執行結果:

Java反射之Call stack introspection詳解

調用結果顯示的方法調用層級關系。

那我們得到這些信息有什么用呢。

1.日志:這些信息可以讓應用的日志系統得到信息更詳細。

2.安全:api可以決定調用者當前包或者類是否有權限進入。

3.流程控制:可以避免一些流程錯誤,比如無限遞歸調用。

實現一個簡單的日志系統:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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));
        }
    }
}

執行結果:

?
1
2
3
模擬打印日志: 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)

上述日志,只是簡單的在控制臺打印一些信息。

總結

以上就是本文關于java反射之call stack introspection詳解的全部內容,希望對大家有所幫助。如有不足之處,歡迎留言指出。

原文鏈接:https://www.2cto.com/kf/201609/544142.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 婷婷五月色综合香五月 | 久久精品一区二区三区四区 | 中文字幕一二三区 | 亚洲欧美日韩精品久久亚洲区 | 成年人在线观看 | 欧美午夜一区二区三区免费大片 | 亚洲在线视频 | 欧美精品一区二 | 天天爽夜夜爽夜夜爽精品视频 | 一区二区三区视频在线观看 | www天天干 | 国产精品不卡一区 | 日韩中文字幕无码一区二区三区 | 日韩精品一区二区三区中文字幕 | 国产目拍亚洲精品99久久精品 | 久久精品91久久久久久再现 | 午夜资源 | 最新高清无码专区 | 激情网婷婷 | 欧美一区二区三区电影 | 精品欧美一区二区三区久久久 | av片在线观看 | 国产激情网址 | 亚洲精品国产一区 | 欧美一区二区三区xxxx监狱 | 国产福利电影一区 | 一区二区观看 | 久久久久久久久久国产 | 午夜精品久久久久久久久 | 日韩中文字幕 | 操操网| 黄色成人在线 | 看av网站 | 午夜久久久 | 国产精品一区二区久久 | 国产高清免费视频 | 欧美freesex交免费视频 | 日本激情视频一区二区三区 | 亚洲男女视频在线观看 | 精品久久久99 | 国产成人久久精品一区二区三区 |