- - PR -
JDIを利用したクラスオブジェクトのフィールドの取得について
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2008-11-12 18:18
こんにちは。
現在JDIを利用し同時に動かしている別スレッドの変数の値を取得しようとしているのですが、詰まってしまったため投稿させていただきました。 アプローチとして、スレッドからStackFrameを取得し、そのStackFrameから値を取得、という方法を採っています。 StackFrameからプリミティブ型やString型については値を取得出来ました。 しかしオブジェクトのフィールドについてはクラスの名前を取得することは出来るのですが、フィールドを取得することが出来ません。 以下が作ったコードの抜粋となります。 /*スレッドからStackFrameを取得するコード*/ public static void main(String[] args) throws Exception{ VirtualMachine vm = connectVirtualMachine(); Sample p = new Sample(); p.start(); String target = p.getName(); ThreadReference tr = searchCurrentThread(vm.allThreads() , target); //対象のスレッド中の全てのスタックフレームを取得 List targetThreadframes = null; tr.suspend(); try { targetThreadframes = tr.frames(); } catch (IncompatibleThreadStateException e) { e.printStackTrace(); } for(Iterator i = targetThreadframes.iterator(); i.hasNext() { StackFrame gotFrame = (StackFrame)i.next(); Method mt = gotFrame.location().method(); List localvalues = null; localvalues = gotFrame.visibleVariables(); Sample_StackFrame Sample_LocalValues = new Sample_StackFrame(localvalues.size()); Sample_LocalValues.findALL(localvalues,gotFrame); } tr.resume(); } /*StackFrameから値を取得するコード(findAllメソッド)*/ public void findALL(List localvalues, StackFrame frame) { stackFrame = frame.toString(); int i = 0; for(Iterator j = localvalues.iterator() ; j.hasNext() ; i++){ LocalVariable var = (LocalVariable) j.next(); Value value = frame.getValue(var); if(value instanceof PrimitiveValue) { System.out.println(((PrimitiveValue)value).doubleValue()); } else if (value instanceof StringReference) { System.out.println(((StringReference)value).value()); } else if (value instanceof ObjectReference) { /* * 問題箇所 */ } } } 上記の問題箇所において、value.type().name()でクラス名は取得出来るのですが、そのクラスオブジェクトのフィールドを取得することが出来ません。 解決のためのアイデア等あればご教授いただけないでしょうか。 よろしくお願いします。 |
1