クラスStackWalker
walkメソッドã¯ã€ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã«å¯¾ã—ã¦StackFrameã®é †æ¬¡ã‚¹ãƒˆãƒªãƒ¼ãƒ ã‚’é–‹ãã€æŒ‡å®šã•れãŸé–¢æ•°ã‚’é©ç”¨ã—ã¦StackFrameストリームを調査ã—ã¾ã™ã€‚ ストリームã¯ã€ã‚¹ã‚¿ãƒƒã‚¯ãŒç”Ÿæˆã•れãŸå®Ÿè¡Œãƒã‚¤ãƒ³ãƒˆã‚’è¡¨ã™æœ€ä¸Šä½ã®ãƒ•レームã‹ã‚‰æœ€ä¸‹ä½ã®ãƒ•レームã¾ã§ã€ã‚¹ã‚¿ãƒƒã‚¯ãƒ»ãƒ•レームè¦ç´ ã‚’é †ç•ªã«ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ walkãƒ¡ã‚½ãƒƒãƒ‰ãŒæˆ»ã‚‹ã¨ã€StackFrameストリームã¯é–‰ã˜ã‚‰ã‚Œã¾ã™ã€‚ クãƒãƒ¼ã‚ºã—ãŸã‚¹ãƒˆãƒªãƒ¼ãƒ ã‚’å†åˆ©ç”¨ã—よã†ã¨ã™ã‚‹ã¨ã€IllegalStateExceptionãŒã‚¹ãƒãƒ¼ã•れã¾ã™ã€‚
「スタック・ウォーカ・オプションã€ã¯ã€StackWalkerã«ã‚ˆã£ã¦å–å¾—ã•ã‚Œã‚‹ã‚¹ã‚¿ãƒƒã‚¯ãƒ»ãƒ•ãƒ¬ãƒ¼ãƒ æƒ…å ±ã‚’æ§‹æˆã—ã¾ã™ã€‚ デフォルトã§ã¯ã€ã‚¯ãƒ©ã‚¹åã¨ãƒ¡ã‚½ãƒƒãƒ‰æƒ…å ±ã¯åŽé›†ã•れã¾ã™ãŒã€Class referenceã¯åŽé›†ã•れã¾ã›ã‚“。 ãƒ¡ã‚½ãƒƒãƒ‰æƒ…å ±ã¯ã€DROP_METHOD_INFOオプションを使用ã—ã¦å‰Šé™¤ã§ãã¾ã™ã€‚ Classオブジェクトã¯ã€RETAIN_CLASS_REFERENCEオプションを使用ã—ã¦ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ãŸã‚ã«ä¿æŒã§ãã¾ã™ã€‚ リフレクションAPIãŠã‚ˆã³å®Ÿè£…クラスã®ã‚¹ã‚¿ãƒƒã‚¯ãƒ»ãƒ•レームã¯ã€ãƒ‡ãƒ•ォルトã§ã¯hiddenã§ã™ã€‚
StackWalkerã¯ã‚¹ãƒ¬ãƒƒãƒ‰ãƒ»ã‚»ãƒ¼ãƒ•ã§ã™ã€‚ 複数ã®ã‚¹ãƒ¬ãƒƒãƒ‰ãŒå˜ä¸€ã®StackWalkerオブジェクトを共有ã—ã¦ã€ç‹¬è‡ªã®ã‚¹ã‚¿ãƒƒã‚¯ã‚’横æ–ã§ãã¾ã™ã€‚
- APIã®ãƒŽãƒ¼ãƒˆ:
- 例
1. 最åˆã®å‘¼ã³å‡ºã—å…ƒãŒæ—¢çŸ¥ã®å®Ÿè£…クラスã®ãƒªã‚¹ãƒˆã‚’フィルタリングã—ã¦æ¤œç´¢ã™ã‚‹ã«ã¯:
StackWalker walker = StackWalker.getInstance(Set.of(Option.DROP_METHOD_INFO, Option.RETAIN_CLASS_REFERENCE)); Optional<Class<?>> callerClass = walker.walk(s -> s.map(StackFrame::getDeclaringClass) .filter(Predicate.not(implClasses::contains)) .findFirst());2. ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã®ä¸Šä½10スタック・フレームã®ã‚¹ãƒŠãƒƒãƒ—ショットを作æˆã™ã‚‹ã«ã¯ã€
ç‰¹ã«æ˜Žè¨˜ã—ãªã„ã‹ãŽã‚Šã€ã“ã®List<StackFrame> stack = StackWalker.getInstance().walk(s -> s.limit(10).toList());StackWalkerクラスã®ã‚³ãƒ³ã‚¹ãƒˆãƒ©ã‚¯ã‚¿ã¾ãŸã¯ãƒ¡ã‚½ãƒƒãƒ‰ã«null引数を渡ã™ã¨ã€NullPointerExceptionãŒã‚¹ãƒãƒ¼ã•れã¾ã™ã€‚ - å°Žå…¥ã•れãŸãƒãƒ¼ã‚¸ãƒ§ãƒ³:
- 9
-
ãƒã‚¹ãƒˆã•れãŸã‚¯ãƒ©ã‚¹ã®ã‚µãƒžãƒªãƒ¼
ãƒã‚¹ãƒˆã•れãŸã‚¯ãƒ©ã‚¹ä¿®é£¾åã¨åž‹ã‚¯ãƒ©ã‚¹èª¬æ˜Žstatic enumStackWalkerã§å–å¾—ã—ãŸã€Œã‚¹ã‚¿ãƒƒã‚¯ãƒ»ãƒ•ãƒ¬ãƒ¼ãƒ ã€æƒ…å ±ã‚’æ§‹æˆã™ã‚‹ã‚ªãƒ—ション。static interfaceStackFrameオブジェクトã¯ã€StackWalkerã«ã‚ˆã£ã¦è¿”ã•れるメソッド呼ã³å‡ºã—を表ã—ã¾ã™ã€‚ -
メソッドã®ã‚µãƒžãƒªãƒ¼
修飾åã¨åž‹ãƒ¡ã‚½ãƒƒãƒ‰èª¬æ˜ŽvoidforEach(Consumer<? super StackWalker.StackFrame> action) ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã®StackFrameストリームã®å„è¦ç´ ã«å¯¾ã—ã¦ã€ã“ã®forEachメソッドをコールã™ã‚‹ãƒ¡ã‚½ãƒƒãƒ‰ã§ã‚るスタックã®ãƒˆãƒƒãƒ—・フレームã‹ã‚‰ç§»å‹•ã—ã¦ã€æŒ‡å®šã•れãŸã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’実行ã—ã¾ã™ã€‚Class<?> getCallerClassを呼ã³å‡ºã—ãŸãƒ¡ã‚½ãƒƒãƒ‰ã‚’呼ã³å‡ºã—ãŸå‘¼ã³å‡ºã—å…ƒã®Classオブジェクトをå–å¾—ã—ã¾ã™ã€‚static StackWalkerStackWalkerインスタンスを返ã—ã¾ã™ã€‚static StackWalkergetInstance(StackWalker.Option option) アクセスå¯èƒ½ãªã‚¹ã‚¿ãƒƒã‚¯ãƒ»ãƒ•ãƒ¬ãƒ¼ãƒ æƒ…å ±ã‚’æŒ‡å®šã™ã‚‹ã€æŒ‡å®šã•れãŸã‚ªãƒ—ションを使用ã—ã¦StackWalkerインスタンスを返ã—ã¾ã™ã€‚static StackWalkergetInstance(Set<StackWalker.Option> options) アクセスå¯èƒ½ãªã‚¹ã‚¿ãƒƒã‚¯ãƒ»ãƒ•ãƒ¬ãƒ¼ãƒ æƒ…å ±ã‚’æŒ‡å®šã™ã‚‹ã€æŒ‡å®šã•れãŸoptionsã‚’æŒã¤StackWalkerインスタンスを返ã—ã¾ã™ã€‚static StackWalkergetInstance(Set<StackWalker.Option> options, int estimateDepth) アクセスå¯èƒ½ãªã‚¹ã‚¿ãƒƒã‚¯ãƒ»ãƒ•ãƒ¬ãƒ¼ãƒ æƒ…å ±ã‚’æŒ‡å®šã™ã‚‹ã€æŒ‡å®šã•れãŸoptionsã‚’æŒã¤StackWalkerインスタンスを返ã—ã¾ã™ã€‚<T> Twalk(Function<? super Stream<StackWalker.StackFrame>, ? extends T> function) 指定ã•れãŸé–¢æ•°ã‚’ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã®StackFrameã®ã‚¹ãƒˆãƒªãƒ¼ãƒ ã«é©ç”¨ã—ã€ã‚¹ã‚¿ãƒƒã‚¯ã®ä¸Šéƒ¨ãƒ•レーム(ã“ã®walkメソッドをコールã™ã‚‹ãƒ¡ã‚½ãƒƒãƒ‰)ã‹ã‚‰ç§»å‹•ã—ã¾ã™ã€‚
-
メソッドã®è©³ç´°
-
getInstance
public static StackWalker getInstance()StackWalkerインスタンスを返ã—ã¾ã™ã€‚ã“ã®
StackWalkerã¯ã€ã™ã¹ã¦ã®ã€Œéš ã—フレームã€ã‚’スã‚ップã™ã‚‹ã‚ˆã†ã«æ§‹æˆã•れã¦ãŠã‚Šã€ã€Œã‚¯ãƒ©ã‚¹å‚ç…§ã€ã¯ä¿æŒã•れã¾ã›ã‚“。- 戻り値:
- ã™ã¹ã¦ã®ã€Œéš ã—フレームã€ã‚’スã‚ップã™ã‚‹ã‚ˆã†ã«æ§‹æˆã•れãŸ
StackWalker。「クラスå‚ç…§ã€ã¯ä¿æŒã•れã¾ã›ã‚“。
-
getInstance
public static StackWalker getInstance(StackWalker.Option option) アクセスå¯èƒ½ãªã‚¹ã‚¿ãƒƒã‚¯ãƒ»ãƒ•ãƒ¬ãƒ¼ãƒ æƒ…å ±ã‚’æŒ‡å®šã™ã‚‹ã€æŒ‡å®šã•れãŸã‚ªãƒ—ションを使用ã—ã¦StackWalkerインスタンスを返ã—ã¾ã™ã€‚- パラメータ:
option-stack walking option- 戻り値:
- 指定ã•れãŸã‚ªãƒ—ã‚·ãƒ§ãƒ³ã§æ§‹æˆã•れãŸ
StackWalker
-
getInstance
public static StackWalker getInstance(Set<StackWalker.Option> options) アクセスå¯èƒ½ãªã‚¹ã‚¿ãƒƒã‚¯ãƒ»ãƒ•ãƒ¬ãƒ¼ãƒ æƒ…å ±ã‚’æŒ‡å®šã™ã‚‹ã€æŒ‡å®šã•れãŸoptionsã‚’æŒã¤StackWalkerインスタンスを返ã—ã¾ã™ã€‚指定ã•れãŸ
optionsãŒç©ºã®å ´åˆã€ã“ã®StackWalkerã¯ã™ã¹ã¦ã®ã€Œéš ã—フレームã€ã‚’スã‚ップã™ã‚‹ã‚ˆã†ã«æ§‹æˆã•れã€ã€Œã‚¯ãƒ©ã‚¹å‚ç…§ã€ã¯ä¿æŒã•れã¾ã›ã‚“。- パラメータ:
options-stack walking options- 戻り値:
- 指定ã•れãŸã‚ªãƒ—ã‚·ãƒ§ãƒ³ã§æ§‹æˆã•れãŸ
StackWalker
-
getInstance
public static StackWalker getInstance(Set<StackWalker.Option> options, int estimateDepth) アクセスå¯èƒ½ãªã‚¹ã‚¿ãƒƒã‚¯ãƒ»ãƒ•ãƒ¬ãƒ¼ãƒ æƒ…å ±ã‚’æŒ‡å®šã™ã‚‹ã€æŒ‡å®šã•れãŸoptionsã‚’æŒã¤StackWalkerインスタンスを返ã—ã¾ã™ã€‚指定ã•れãŸ
optionsãŒç©ºã®å ´åˆã€ã“ã®StackWalkerã¯ã™ã¹ã¦ã®ã€Œéš ã—フレームã€ã‚’スã‚ップã™ã‚‹ã‚ˆã†ã«æ§‹æˆã•れã€ã€Œã‚¯ãƒ©ã‚¹å‚ç…§ã€ã¯ä¿æŒã•れã¾ã›ã‚“。estimateDepthã¯ã€StackWalkerãŒãƒãƒƒãƒ•ァ・サイズã®ãƒ’ントã¨ã—ã¦ä½¿ç”¨ã§ãã‚‹ã€ã“ã®StackWalkerãŒç§»å‹•ã™ã‚‹ã‚¹ã‚¿ãƒƒã‚¯ãƒ»ãƒ•レームã®è¦‹ç©ã‚Šæ•°ã‚’指定ã—ã¾ã™ã€‚- パラメータ:
options-stack walking optionsestimateDepth- トラãƒãƒ¼ã‚¹ã•ã‚Œã‚‹ã‚¹ã‚¿ãƒƒã‚¯ãƒ»ãƒ•ãƒ¬ãƒ¼ãƒ ã®æŽ¨å®šæ•°ã€‚- 戻り値:
- 指定ã•れãŸã‚ªãƒ—ã‚·ãƒ§ãƒ³ã§æ§‹æˆã•れãŸ
StackWalker - スãƒãƒ¼:
IllegalArgumentException-estimateDepth <= 0ã®å ´åˆ
-
walk
public <T> T walk(Function<? super Stream<StackWalker.StackFrame>, ? extends T> function) 指定ã•れãŸé–¢æ•°ã‚’ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã®StackFrameã®ã‚¹ãƒˆãƒªãƒ¼ãƒ ã«é©ç”¨ã—ã€ã‚¹ã‚¿ãƒƒã‚¯ã®ä¸Šéƒ¨ãƒ•レーム(ã“ã®walkメソッドをコールã™ã‚‹ãƒ¡ã‚½ãƒƒãƒ‰)ã‹ã‚‰ç§»å‹•ã—ã¾ã™ã€‚ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ãŒè¿”ã•れるã¨ã€
StackFrameストリームãŒé–‰ã˜ã‚‰ã‚Œã¾ã™ã€‚ é–‰ã˜ãŸStream<StackFrame>オブジェクトãŒå†åˆ©ç”¨ã•れるã¨ã€IllegalStateExceptionãŒã‚¹ãƒãƒ¼ã•れã¾ã™ã€‚- APIã®ãƒŽãƒ¼ãƒˆ:
- ãŸã¨ãˆã°ã€æœ€åˆã®10個ã®å‘¼ã³å‡ºã—フレームを検索ã™ã‚‹ã«ã¯ã€æœ€åˆã«å®£è¨€ã‚¯ãƒ©ã‚¹ãŒãƒ‘ッケージ
com.foo内ã«ã‚るフレームをスã‚ップã—ã¾ã™:List<StackFrame> frames = StackWalker.getInstance().walk(s -> s.dropWhile(f -> f.getClassName().startsWith("com.foo.")) .limit(10) .toList());ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã€
Stream<StackFrame>ã‚’è¿”ã—ã€å‘¼å‡ºã—å´ãŒã‚¹ãƒˆãƒªãƒ¼ãƒ を直接æ“作ã§ãるよã†ã«ã™ã‚‹ã®ã§ã¯ãªãã€Functionを使用ã—ã¦Stream<StackFrame>ã‚’å—ã‘入れã¾ã™ã€‚ Java仮想マシンã¯ã€ãŸã¨ãˆã°æœ€é©åŒ–解除ã«ã‚ˆã£ã¦ã€ã‚¹ãƒ¬ãƒƒãƒ‰ã®åˆ¶å¾¡ã‚¹ã‚¿ãƒƒã‚¯ã‚’自由ã«å†ç·¨æˆã§ãã¾ã™ã€‚ ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã€Functionパラメータをå–å¾—ã™ã‚‹ã“ã¨ã§ã€ã‚¹ãƒ¬ãƒƒãƒ‰ã®åˆ¶å¾¡ã‚¹ã‚¿ãƒƒã‚¯ã®å®‰å®šã—ãŸãƒ“ューを介ã—ã¦ã‚¹ã‚¿ãƒƒã‚¯ãƒ»ãƒ•レームã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™ã€‚パラレル実行ã¯äº‹å®Ÿä¸Šç„¡åйã«ãªã‚Šã€ã‚¹ãƒˆãƒªãƒ¼ãƒ ・パイプラインã®å®Ÿè¡Œã¯ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã§ã®ã¿è¡Œã‚れã¾ã™ã€‚
- 実装上ã®ãƒŽãƒ¼ãƒˆ:
- 実装ã§ã¯ã€ã‚¹ã‚¿ãƒƒã‚¯ãƒ»ã‚¦ã‚©ãƒ¼ã‚ングã«å›ºæœ‰ã®ãƒ•レームを固定ã—ã¦ã‚¹ã‚¿ãƒƒã‚¯ã‚’安定ã•ã›ã€ã‚¹ã‚¿ãƒƒã‚¯ãƒ»ã‚¦ã‚©ãƒ¼ã‚ングãŒã‚¢ãƒ³ã‚«ãƒ¼ã•れãŸãƒ•レームã®ä¸Šã§å®Ÿè¡Œã•れるよã†ã«ã—ã¾ã™ã€‚ ストリーム・オブジェクトãŒã‚¯ãƒãƒ¼ã‚ºã•れるã‹ã€å†åˆ©ç”¨ã•れるã¨ã€
IllegalStateExceptionãŒã‚¹ãƒãƒ¼ã•れã¾ã™ã€‚ - 型パラメータ:
T- スタック・フレームã®ã‚¹ãƒˆãƒªãƒ¼ãƒ ã«é–¢æ•°ã‚’é©ç”¨ã—ãŸçµæžœã®åž‹ã€‚- パラメータ:
function- 「スタック・フレームã€ã®ã‚¹ãƒˆãƒªãƒ¼ãƒ ã‚’å–å¾—ã—ã€çµæžœã‚’è¿”ã™ãƒ•ァンクション。- 戻り値:
- 「スタック・フレームã€ã®ã‚¹ãƒˆãƒªãƒ¼ãƒ ã«é–¢æ•°ã‚’é©ç”¨ã—ãŸçµæžœã€‚
-
forEach
public void forEach(Consumer<? super StackWalker.StackFrame> action) ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã®StackFrameストリームã®å„è¦ç´ ã«å¯¾ã—ã¦ã€ã“ã®forEachメソッドをコールã™ã‚‹ãƒ¡ã‚½ãƒƒãƒ‰ã§ã‚るスタックã®ãƒˆãƒƒãƒ—・フレームã‹ã‚‰ç§»å‹•ã—ã¦ã€æŒ‡å®šã•れãŸã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’実行ã—ã¾ã™ã€‚ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã€
walk(s -> { s.forEach(action); return null; });- パラメータ:
action- ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã®ã‚¹ã‚¿ãƒƒã‚¯ã®å„StackFrameã«å¯¾ã—ã¦å®Ÿè¡Œã•れるアクション
-
getCallerClass
public Class<?> getCallerClass()getCallerClassを呼ã³å‡ºã—ãŸãƒ¡ã‚½ãƒƒãƒ‰ã‚’呼ã³å‡ºã—ãŸå‘¼ã³å‡ºã—å…ƒã®Classオブジェクトをå–å¾—ã—ã¾ã™ã€‚ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã€ã“ã®
StackWalkerãŒæ§‹æˆã•れã¦ã„ã‚‹SHOW_REFLECT_FRAMESãŠã‚ˆã³SHOW_HIDDEN_FRAMESオプションã«é–¢ä¿‚ãªãã€ã€Œåå°„æž ã€ã€MethodHandleãŠã‚ˆã³ã€Œéš ã—フレームã€ã‚’フィルタ処ç†ã—ã¾ã™ã€‚ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã€å‘¼å‡ºã—å´ãƒ•レームãŒå˜åœ¨ã™ã‚‹å ´åˆã«ã‚³ãƒ¼ãƒ«ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ ã‚¹ã‚¿ãƒƒã‚¯ã®æœ€ä¸‹ä½ãƒ•レームã‹ã‚‰ã‚³ãƒ¼ãƒ«ã•れるã¨ã€
IllegalCallerExceptionãŒã‚¹ãƒãƒ¼ã•れã¾ã™ã€‚ã“ã®
StackWalkerãŒRETAIN_CLASS_REFERENCEã‚ªãƒ—ã‚·ãƒ§ãƒ³ã§æ§‹æˆã•れã¦ã„ãªã„å ´åˆã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯UnsupportedOperationExceptionをスãƒãƒ¼ã—ã¾ã™ã€‚- APIã®ãƒŽãƒ¼ãƒˆ:
- ãŸã¨ãˆã°ã€
Util::getResourceBundleã¯ã€ã‚³ãƒ¼ãƒ«å…ƒã®ã‹ã‚りã«ãƒªã‚½ãƒ¼ã‚¹ãƒ»ãƒãƒ³ãƒ‰ãƒ«ã‚’ãƒãƒ¼ãƒ‰ã—ã¾ã™ã€‚getCallerClassを呼ã³å‡ºã—ã¦ã€Util::getResourceBundleã¨ã„ã†ãƒ¡ã‚½ãƒƒãƒ‰ã‚’æŒã¤ã‚¯ãƒ©ã‚¹ã‚’è˜åˆ¥ã—ã¾ã™ã€‚ 次ã«ã€ãã®ã‚¯ãƒ©ã‚¹ã®ã‚¯ãƒ©ã‚¹ãƒ»ãƒãƒ¼ãƒ€ãƒ¼ã‚’å–å¾—ã—ã€ã‚¯ãƒ©ã‚¹ãƒ»ãƒãƒ¼ãƒ€ãƒ¼ã‚’使用ã—ã¦ãƒªã‚½ãƒ¼ã‚¹ãƒ»ãƒãƒ³ãƒ‰ãƒ«ã‚’ãƒãƒ¼ãƒ‰ã—ã¾ã™ã€‚ ã“ã®ä¾‹ã®å‘¼ã³å‡ºã—元クラスã¯MyToolã§ã™ã€‚class Util { private final StackWalker walker = StackWalker.getInstance(Set.of(Option.DROP_METHOD_INFO, Option.RETAIN_CLASS_REFERENCE)); public ResourceBundle getResourceBundle(String bundleName) { Class<?> caller = walker.getCallerClass(); return ResourceBundle.getBundle(bundleName, Locale.getDefault(), caller.getClassLoader()); } } class MyTool { private final Util util = new Util(); private void init() { ResourceBundle rb = util.getResourceBundle("mybundle"); } }walkメソッドを使用ã—ã¦å‘¼ã³å‡ºã—元クラスを検索ã™ã‚‹åŒç‰ã®æ–¹æ³•ã¯ã€æ¬¡ã®ã¨ãŠã‚Šã§ã™ã€‚(リフレクション・フレームã€MethodHandleãŠã‚ˆã³éžè¡¨ç¤ºãƒ•レームã®ãƒ•ィルタリング):Optional<Class<?>> caller = walker.walk(s -> s.map(StackFrame::getDeclaringClass) .skip(2) .findFirst());javaランãƒãƒ£ã«ã‚ˆã£ã¦èµ·å‹•ã•れãŸstatic public void mainメソッドやã€JNIアタッãƒã•れãŸã‚¹ãƒ¬ãƒƒãƒ‰ã‹ã‚‰èµ·å‹•ã•れãŸãƒ¡ã‚½ãƒƒãƒ‰ãªã©ã€ã‚¹ã‚¿ãƒƒã‚¯ã®æœ€ä¸‹ä½ãƒ•レームã§ã‚るメソッドã‹ã‚‰getCallerClassメソッドãŒã‚³ãƒ¼ãƒ«ã•れるã¨ã€IllegalCallerExceptionãŒã‚¹ãƒãƒ¼ã•れã¾ã™ã€‚ - 戻り値:
- ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’呼ã³å‡ºã™å‘¼å‡ºã—å´ã®ã‚³ãƒ¼ãƒ«å…ƒã®
Classオブジェクト。 - スãƒãƒ¼:
UnsupportedOperationException- ã“ã®StackWalkerãŒOption.RETAIN_CLASS_REFERENCEã§æ§‹æˆã•れã¦ã„ãªã„å ´åˆã€‚IllegalCallerException- 呼出ã—å´ãƒ•レームãŒãªã„å ´åˆã€ã¤ã¾ã‚Šã€ã‚¹ã‚¿ãƒƒã‚¯ã®æœ€å¾Œã®ãƒ•レームã§ã‚るメソッドã‹ã‚‰ã“ã®getCallerClassメソッドãŒå‘¼ã³å‡ºã•れãŸå ´åˆã€‚
-