2

クイック編集: 以下で指摘されているように、BFS を実行する必要がありますが、まだ考える時間がなかった新しいフィールドの取得を停止する必要があります。助けてくれてありがとう!

Java リフレクションを使用してクラスのフィールドを再帰的に取得しようとしており、基本的に表示するツリーを作成しています

Class
 field1 class
  field1.1 class
  field1.2 class
 field2 class
  field 2.1 class
  field 2.2 class

これは再帰的な適切なパーサーのためのものなので、再帰的な表示関数を作成するのはクールだと思いました。残念ながら、それは私を押しつぶしています。

Class1 と Class2 のフィールドを持つクラス Foo の例で、それぞれが異なるクラスのフィールドを持つことができます。

class Assignment extends Statement {
Variable target;
Expression source;
Assignment (Variable t, Expression e) {
    target = t;
    source = e;
}

私の再帰的な方法:

private void recurse(Object object){
    System.out.println(object.getClass());
    for (Field field : object.getClass().getDeclaredFields()){
        System.out.println(field.getType());
        System.out.println(field.getName());
        if(!field.getType().isPrimitive() || field.getType() instanceof Class || field.getName() != "clazz"){
            //recurse(field);
        }
    }

println はテスト用であり、Foo の出力例は次のようになります (再帰なしで動作するようです)。

class Assignment
class Variable
target
class Expression
source

しかし、変数クラスを取得してそのフィールドなどを取得する方法がわかりません。この情報を含むフィールドは、クラス Field を提供します。

また、再帰を停止するポイントが必要なことはわかっていますが、プリマティブ フィールドで停止してもうまくいかないようです。どんな提案も役に立ち、私が身もだえしているように見えるものの核心を理解するのに本当に役立ちます.

補足: このクラスの手段については、クラスごとに表示メソッドを配置して呼び出すことができることはわかっていますが、リフレクションのプロセスはより興味深く、おそらく再利用できるように思えました。

TLDR: Field に含まれる実際のフィールドのクラスを取得するにはどうすればよいですか?

何かが足りない場合は申し訳ありませんが、最初の質問です。

御時間ありがとうございます!

-アレックス

4

2 に答える 2

1

さて、あなたはグラフとその中の検索アルゴリズムを記述しています。

あなたのグラフはG=(V,E)どこV = {all object types }E = { (u,v) | u has a field of type v }です。

BFSを使用して、単一のソースからグラフを「探索」し、そこからすべての「アクセス可能な頂点 [タイプ]」を取得できます [単一のソース]。

BFS はvisitedセットを保持し、既に探索された頂点 [タイプ] の探索を回避し、発見する新しいものが何もない場合 [BFS] を停止します [キューが空です]。

DFSでも同じことができますが、グラフにサイクルvisitedがある場合の無限ループを回避するために、セットが必要になります[たとえば、ツリーなどの複合クラスの一部の実装では、それぞれが含まれる自体] 。NodeNode

于 2012-04-13T18:12:54.443 に答える
0

すぐに繰り返すので、トップ レベル クラスの最初のフィールドの Object までずっと下に移動してから、次のフィールドに移動します。つまり、深さ優先検索を行っています。

幅優先検索に似た出力を探しています。これには、再帰を使用する代わりに、キューを使用して新しいクラスを最後に追加し、次のプロセスをポップオフすることが含まれます。

ここまでたどり着いたので、ここですべてを説明するつもりはありません。

于 2012-04-13T18:10:23.543 に答える