かずきのBlog

C#やJavaやRubyとメモ書き

目次

Blog 利用状況

ニュース

わんくまBlogが不安定になったため、前に書いてたはてなダイアリーにメインを移動します。
かずきのBlog@Hatena
技術的なネタは、こちらにも、はてなへのリンクという形で掲載しますが、雑多ネタははてなダイアリーだけに掲載することが多いと思います。
コメント
プログラマ的自己紹介
お気に入りのツール/IDE
プロフィール
経歴
広告
アクセサリ

書庫

日記カテゴリ

[Java][NetBeans]プロジェクト内のJavaのクラスの情報とってくるよ

結構前にも同じようなことを題材に書いたような気がするけど、人間とは忘れる生き物です。
もれなく俺も人間なので、きれいさっぱり忘れてしまった。

ということで復習してみよう!

ちなみに、やろうとしてることは、NetBeansのプラグインを作って、そこからプロジェクト内の選択されたJavaのクラスのフィールドやらメソッドやらをとってしまおうという感じのものです。

とりあえず、プロジェクトを作成して、必要そうなライブラリを追加しておく。

image

因みに、参考にしてるのはこっちのページです。
さくっとToolbarあたりにボタンを1つ追加する。

image

アイコンも参考にしてるサイトから虹っぽいやつを拝借させてもらった。
これでクリックしたら何かできるとっかかりができた。ここにいろいろ書いていく。
とりあえず、動作確認のために簡単なのを書いてみた。

    protected void performAction(Node[] activatedNodes) {
        DataObject dataObject = activatedNodes[0].getLookup().lookup(DataObject.class);
        StatusDisplayer.getDefault().setStatusText("こんにちは世界!!");
    }

この状態で実行すると、NetBeansのToolbarに新しいボタンが追加される。
何かファイルとかを選択すると、押せるようになるので、押してみるとステータスバーにこんにちは世界!!と表示される。
よし、とりあえずの動きはよさそうだ。

image

とりあえず、選択されたファイルから、Javaのクラスの情報とるための下準備のコードを書いていく。
まず、DataObjectからFileObjectを取得して、そこからJavaSourceを取得するところまで書いてみる。

JavaSourceが取得できれば、そこから色々なことができるようになって夢広がるっぽい。
早速、さっきの「こんにちは世界!!」を消して下のコードを書いてみたよ!

    protected void performAction(Node[] activatedNodes) {
        DataObject dataObject = activatedNodes[0].getLookup().lookup(DataObject.class);
        
        FileObject selectedFile = dataObject.getPrimaryFile();
        JavaSource selectedJavaSource = JavaSource.forFileObject(selectedFile);
        if (selectedJavaSource != null) {
            StatusDisplayer.getDefault().setStatusText(selectedJavaSource + "が取得できた");
        } else {
            StatusDisplayer.getDefault().setStatusText("Javaのクラスじゃない…");
        }
    }

実行するとこんな感じ。
左は、パッケージを選択した状態でボタンを押したときのメッセージ。右は、Main.javaを選択した状態でボタンを押したときのメッセージ。
image image

ここまでは、順調にできてる!!
さて、ちょいと話が変わるけど、今回ツールバーに追加したボタンは、Javaのファイルを選択したときにしか押してもらいたくない。
んで、さっきのコードの動きを見る限り、Javaのファイル以外のときは、JavaSourceの取得のところでnullになる。

ってことで、enableメソッドをオーバーライドしてちょろっとコードを書く。

    /**
     * 有効・無効の判断をする。JavaSourceが取得できるものは有効です。
     */
    @Override
    protected boolean enable(Node[] arg) {
        if (super.enable(arg)) {
            return getSelectedJavaSource(lookupDataObject(arg)) != null;
        }
        return false;
    }
    /**
     * DataObjectからJavaSourceを取得する。
     */
    private JavaSource getSelectedJavaSource(DataObject dataObject) {
        FileObject selectedFile = dataObject.getPrimaryFile();
        return JavaSource.forFileObject(selectedFile);        
    }
    /**
     * 選択されてるノードから、DataObjectを取得する。
     */
    private DataObject lookupDataObject(Node[] activatedNodes) {
        return activatedNodes[0].getLookup().lookup(DataObject.class);
    }

これで、Javaのファイルを選択したときだけツールバーのボタンが有効になる。
段々、目的の処理を書くところに近づいてる。

JavaSourceについて、何か処理をするときは、runUserActionメソッドを呼び出してやるっぽい。
そこには、Task<CompilationController>を渡して、そのrunメソッドで処理を書く。
というわけで処理の中身を書く一歩手前まで書いてみる。

    protected void performAction(Node[] activatedNodes) {
            DataObject dataObject = lookupDataObject(activatedNodes);
            JavaSource selectedJavaSource = getSelectedJavaSource(dataObject);
        try {
            selectedJavaSource.runUserActionTask(new Task<CompilationController>() {
                public void run(CompilationController arg0) throws Exception {
                    // ここに色々書いていく
                }
            }, true);
        } catch (IOException ex) {
            Exceptions.printStackTrace(ex);
        }
    }

これで準備は整ったはず!ガンガン書いていく!
まず、runメソッドの引数のCompilationControllerをELEMENT_RESOLVEまで持っていってクラス名とかくらいがとれるようにしておく。

クラス名、メソッド名の一覧の取得のためのコードだけど…
結構長いことになった。とりあえずコードを張っておく。

    protected void performAction(Node[] activatedNodes) {
            DataObject dataObject = lookupDataObject(activatedNodes);
            JavaSource selectedJavaSource = getSelectedJavaSource(dataObject);
        try {
            final StringBuilder sb = new StringBuilder();
            selectedJavaSource.runUserActionTask(new Task<CompilationController>() {
                public void run(final CompilationController compilationController) throws Exception {
                    // 要素が見つかるくらいまでは処理してねと
                    compilationController.toPhase(JavaSource.Phase.ELEMENTS_RESOLVED);
                    new TreePathScanner<Void, Void>(){
                        @Override
                        public Void visitClass(ClassTree tree, Void arg) {
                            TreePath path = getCurrentPath();
                            Element element = compilationController.getTrees().getElement(path);
                            TypeElement type = (TypeElement) element;
                            sb.append(type.getQualifiedName()).append("\n");
                            List<? extends Element> enclosedElements = type.getEnclosedElements();
                            for (Element elm : enclosedElements) {
                                sb.append("\t").append(elm.getKind()).append(": ").append(elm.getSimpleName()).append("\n");
                            }
                            return null;
                        }
                    }.scan(compilationController.getCompilationUnit(), null);
                    
                    InputOutput io = IOProvider.getDefault().getIO("Dump", true);
                    io.getOut().println(sb);
                    io.getOut().close();
                }
            }, true);
        } catch (IOException ex) {
            Exceptions.printStackTrace(ex);
        }
    }

肝になるのは、TreePathScannerのvisitClassをオーバーライドしてるあたり。
このメソッド内にいるってことは、現在解析がクラスの定義まで進んでるってことだから、getCurrentPathで現在位置をとってきてgetElementでクラス定義を表すTypeElementがとってこれる(と信じてる)。

あとは、getEnclosedElementsでElementの中身をStringBuilderに追加していってる。
最後に、Outputウィンドウに結果を出力してる。

適当にフィールドやメソッドを作ったクラスにたいして、このコードを走らせるとOutputウィンドウに下のような感じで表示された。

javaapplication1.Main
        CONSTRUCTOR: <init>
        FIELD: value
        METHOD: getValue
        METHOD: setValue
        METHOD: main


ちゃんととれてるっぽい。
後は、フィールドの型や、メソッドの引数や戻り値がとれれば大体大丈夫かな?
今日は、もう眠いのでここらへんでダウン。

ってか、このエントリーかくのに、のべ4時間くらい使ってそうな予感…
TreePathScannerを使わないで、同じ情報取得する方法がないかな~って探し回ってたのが敗因だった。
だって、TreePathScannerをいちいち継承するのがめんどくさい!でも、今日調べた範囲だと、ほかにいい方法がみつからなかった。

誰か、素敵な方法を知ってたら教えてくれないかなぁ

投稿日時 : 2008年4月28日 0:45

Feedback

# re: [Java][NetBeans]プロジェクト内のJavaのクラスの情報とってくるよ 2008/04/28 10:47 凪瀬

> TreePathScannerを使わないで、同じ情報取得する方法がないかな~って探し回ってたのが敗因だった。

確かにVisitorパターンの実装は面倒ですからねぇ。
プラグイン作るならやっぱりNetBeansの方が楽そうですよね。

# re: [Java][NetBeans]プロジェクト内のJavaのクラスの情報とってくるよ 2008/04/28 11:53 かずき

確かに楽っちゃ楽なんですけど、日本語情報がEclipseに比べて、まだ少ないってのがネックになりますね~。
ここら辺改善しようと、今頑張ってるみたいですけど。

# louis vuitton diaper bag 2012/10/28 3:18 http://www.louisvuittonoutletdiaperbag.com/

Friendships last a long time when ever per colleague says he's got a slight favorable position about the more.
louis vuitton diaper bag http://www.louisvuittonoutletdiaperbag.com/

# burberry outlet online 2012/10/28 16:30 http://www.burberryoutletonlineshopping.com/

Some truly great content on this website , thankyou for contribution.
burberry outlet online http://www.burberryoutletonlineshopping.com/

# t shirt scarf 2012/10/28 16:33 http://www.burberryoutletscarfsale.com/accessories

Just wanna say that this is extremely helpful, Thanks for taking your time to write this.
t shirt scarf http://www.burberryoutletscarfsale.com/accessories/burberry-scarf.html

# burberry mens shirts 2012/10/28 16:33 http://www.burberryoutletscarfsale.com/burberry-me

I truly appreciate this post. I've been looking everywhere for this! Thank goodness I found it on Bing. You have made my day! Thanks again!
burberry mens shirts http://www.burberryoutletscarfsale.com/burberry-men-shirts.html

# burberry wallets 2012/10/28 16:33 http://www.burberryoutletscarfsale.com/accessories

I conceive this internet site holds some really fantastic info for everyone :D. "As ill-luck would have it." by Miguel de Cervantes.
burberry wallets http://www.burberryoutletscarfsale.com/accessories/burberry-wallets-2012.html

# cheap tie 2012/10/28 16:33 http://www.burberryoutletscarfsale.com/accessories

Absolutely written subject material, thanks for selective information. "The bravest thing you can do when you are not brave is to profess courage and act accordingly." by Corra Harris.
cheap tie http://www.burberryoutletscarfsale.com/accessories/burberry-ties.html

# women t shirts 2012/10/28 16:33 http://www.burberryoutletscarfsale.com/burberry-wo

I like this post, enjoyed this one thanks for posting .
women t shirts http://www.burberryoutletscarfsale.com/burberry-womens-shirts.html

# burberry watches for women 2012/10/28 16:33 http://www.burberryoutletscarfsale.com/accessories

I like this post, enjoyed this one appreciate it for posting .
burberry watches for women http://www.burberryoutletscarfsale.com/accessories/burberry-watches.html

# burberry wallets 2012/11/03 1:09 http://www.burberrysalehandbags.com/burberry-walle

What i don't realize is in reality how you are no longer really much more well-favored than you may be right now. You're so intelligent. You already know thus significantly when it comes to this topic, made me in my opinion imagine it from a lot of various angles. Its like women and men don't seem to be fascinated except it is one thing to accomplish with Girl gaga! Your personal stuffs great. All the time deal with it up!
burberry wallets http://www.burberrysalehandbags.com/burberry-wallets-2012.html

# mens shirts 2012/11/03 12:31 http://www.burberryoutletlocations.com/burberry-me

Simply a smiling visitant here to share the love (:, btw outstanding layout.
mens shirts http://www.burberryoutletlocations.com/burberry-men-shirts.html

# burberry wallets 2012/11/03 12:31 http://www.burberryoutletlocations.com/burberry-wa

Regards for helping out, fantastic information.
burberry wallets http://www.burberryoutletlocations.com/burberry-wallets-2012.html

# Burberry Tie 2012/11/03 12:31 http://www.burberryoutletlocations.com/burberry-ti

Thanks for the sensible critique. Me and my neighbor were just preparing to do a little research about this. We got a grab a book from our area library but I think I learned more from this post. I am very glad to see such great information being shared freely out there.
Burberry Tie http://www.burberryoutletlocations.com/burberry-ties.html

# burberry watches for women 2012/11/03 12:32 http://www.burberryoutletlocations.com/burberry-wa

Some truly excellent information, Sword lily I discovered this. "The historian must have some conceptions of how men who are not historians behave." by Edward Morgan Forster.
burberry watches for women http://www.burberryoutletlocations.com/burberry-watches.html

# scarf 2012/11/03 12:32 http://www.burberryoutletlocations.com/burberry-sc

I think this internet site holds some very excellent information for everyone. "The expert at anything was once a beginner." by Hayes.
scarf http://www.burberryoutletlocations.com/burberry-scarf.html

# burberry bag 2012/11/03 12:32 http://www.burberryoutletlocations.com/burberry-wo

I'll immediately grasp your rss as I can not to find your e-mail subscription link or e-newsletter service. Do you've any? Kindly let me recognise in order that I could subscribe. Thanks.
burberry bag http://www.burberryoutletlocations.com/burberry-women-bags.html

# ELFWZLKuYGF 2018/12/17 12:13 https://www.suba.me/

xxYgjr Incredible! This blog looks just like my old one! It as on a completely different subject but it has pretty much the same page layout and design. Great choice of colors!

# IBAtkTANYx 2018/12/20 4:36 https://www.suba.me/

C4sf9b I think this is among the most vital info for me.

タイトル
名前
Url
コメント