2017-01-09 6 views
0

クラスEtcStructのオブジェクトのitemsDataというリストがありますが、クラスは使用したいファイルによって異なります(クラスは変数setterとgetterでいっぱいです) :メソッドに渡されたオブジェクトを元の型にキャストするJava

ObservableList<EtcStruct> itemsData = FXCollections.observableArrayList(); 

私はどのオブジェクトタイプでも動作するはずのメソッドに渡しています。ファイルから呼び出されたメソッドを選択して実行します。

作品以上
public static void parseToFile(ObservableList itemsData){ 
    EtcStruct itemObject = (EtcStruct) itemsData.get(0); 
    System.out.print((int)reflectedmethod.invoke(itemObject); 
} 

コードが、私は何を達成したいことは、私が使用する予定のどんなstructclassため、それをより柔軟にするために、それのオブジェクトタイプを編集せずに方法を働かせるです。

構造クラス名と.getClass()を渡して何かを試してみましたが、元の型を返しますが、itemsData元の型の新しいオブジェクトを作成し、itemsDataオブジェクトをキャストするために何をするべきかわかりません。

public static void parseToFile(ObservableList itemsData,Class c){ 
    Object itemObject = c.newInstance(); 
    Object newobject = curClass.newInstance(); 
    newobject = c.cast(itemsList.get(0)); 
} 

上記は私にとっては馬鹿だと思われ、明らかに仕事はありませんでした。

+0

なぜあなたはそれをキャストしようとしていますか?なぜ生の型を使用していますか? – shmosel

+2

引数をダウンキャストする必要はありません。そうすることは、継承と上書きの目的を破ります。引数が 'Observable'の場合、メソッドは' Observable'ビヘイビアを使用することのみを約束します。 'EtcStruct'の振る舞いが必要な場合は、それを引数の型として宣言してください。また、アーキテクチャミスをハックするためにリフレクションを使用しないでください。これはリフレクションのユースケースではなく、タイプ指向プログラミングやオブジェクト指向プログラミングのユースケースです。 –

+0

Javaで異なる構造のバイナリファイルを解析するにはどうしたらいいですか?私がしようとしていることは、対応するフィールドのセッターとゲッターをただちに生成し、パーサメソッドに反映させることです。 ここで欠落しているのは、どのクラスのstructが呼び出されたかをメソッドに知らせることです。 – kthxbai2

答えて

0

静的なオブジェクトの入力を維持するためにGenericsを使用することはできると思います。関数parseToFileをパラメータ化しようとします。ここに例があります:

public static void parseToFile(ObservableList<EtcStruct> itemsData){ 
    EtcStruct itemObject = itemsData.get(0); 
    System.out.print((int)reflectedmethod.invoke(itemObject); 
} 
+0

私はこれを最初に好きでしたが、メソッドEtcStructのように格納されている他のデータ構造のためにメソッドを再利用できるようにしようとしました。 – kthxbai2

+0

通常、インタフェースとポリモフィフィズムを使用して可撓性を追加するためのオブジェクト指向プログラミングです。 getInt()という名前のメソッドを使って 'EtcStruct'というインターフェースを呼び出すことができます。メソッドparseToFileは、EtcStructとその派生クラスによって、パラメータ化されたObservableListをとります。たとえば、あなたのmathodは次のように実装できます: public static void test(ObservableList <?extends EtcStruct> items){ EtcStruct item = items.get(0); System.out.println(item.getInt()); } –

1

あなたのコメントを読んだ後に私はあなたのケースで反射を使用する理由が分かりました。 GUIビルダ/エディタは、リフレクションを使用してコンポーネントの値を設定/取得するためのインタフェースを提供する例です。それでも、IMHO、リフレクションは、クラスを所有しているときにデザインするツールではなく、主要デザイナーです。

interface Parsable { 
    default int parse() { 
     System.out.println("Here I do something basic"); 
     return 0; 
    } 
} 

class BasicStruct implements Parsable { } 

class EtcStruct implements Parsable { 

    @Override 
    public int parse() { 
     System.out.println("Here I do something specific to an EtcStruct"); 
     return 1; 
    } 
} 

// If some structs have a parent-child relationship 
// you can alternatively `extend EtcStruct` for example. 
class OtherStruct extends EtcStruct { 

    @Override 
    public int parse() { 
     super.parse(); 
     System.out.println("Here I do something specific to an OtherStruct"); 
     return 2; 
    } 
} 

void parseToFile(Parsable parsable) { 
    System.out.println(parsable.parse()); 
} 

// If you use a generic with a specific class you don't 
// have to guess or care which kind it is! 
void parseToFile(ObservableList<Parsable> parsables) { 
    for (Parsable p : parsables) { 
     parseToFile(p); 
    } 
} 


public static void main(String[] args) { 
    ObservableList<Parsable> parsables = FXCollections.observableArrayList(); 
    parsables.add(new BasicStruct()); 
    parsables.add(new EtcStruct()); 
    parsables.add(new OtherStruct()); 
    parseToFile(parsables); 
} 


出力::可能な場合は、より多くのこのような何かのために努力すべきである。もちろん、

Here I do something basic 
0 
Here I do something specific to an EtcStruct 
1 
Here I do something specific to an EtcStruct 
Here I do something specific to an OtherStruct 
2 

、これはあなたのニーズを満たすために変更する必要単なる一例です。

しかし、私がまだ得られないことは、から構文解析できないという理由でファイルを解析できるかどうかです。それにもかかわらず、私はを扱ったときに、手動でファイルにオブジェクトを解析する方法を示すためにsome codeを一緒に打ちました。

アイデアは、豆のような契約を満たすことです。つまり、各構造体にはパラメータなしのコンストラクタが用意されている必要があります。リフレクションによって管理されるすべてのフィールドは、Javaの命名規則に従い、パブリックセッタとゲッタの両方を持ちます。

ファイルの書き込みに巻き込まれないようにしてください。それはあなたのニーズによって決定されます。この規約に従うことによって、私は任意のObjectを解析可能な構造として扱うことができます。参考までにあまり洗練されていないバージョン:

public void parseToFile(Object object) throws IOException, InvocationTargetException, IllegalAccessException { 
    fos = new FileOutputStream("example" + object.getClass().getSimpleName()); 
    List<Method> getters = Arrays.stream(object.getClass().getMethods()) 
      .filter(method -> method.getName().startsWith("get") && !method.getName().endsWith("Class")) 
      .collect(Collectors.toList()); 
    for (Method getter : getters) { 
     String methodName = getter.getName(); 
     String key = String.valueOf(Character.toLowerCase(methodName.charAt(3))) + 
       methodName.substring(4, methodName.length()); 
     fos.write((key + " : " + String.valueOf(getter.invoke(object)) + "\n").getBytes()); 
    } 
    fos.close(); 
} 
+0

特定のバイナリ構造のファイル用のエディタ(約20個)を作成します。リストは、対応する構造体クラスのオブジェクト(構造に基づくフィールドを有する)を保持する。 。構造体にはsetterメソッドを反映したファイルからの解析とオブジェクトへの呼び出しのために、setterとgetterがあります。オブジェクトをリストに追加すると、そのオブジェクトはうまく動作します。他の手でファイルを解析することは私を悩ますことです。私はJavaとプログラミングの一般的なので、それは少なくともまともなアプローチであれば確かに私はまだ新しいです。 – kthxbai2

+0

私はフィールドの種類や数にかかわらず、解析メソッドを再利用できるようにしたかったので、フィールドの数が30以上のときには設定しないでください。 – kthxbai2

+0

@ kthxbai2、私の答えをもう一度読んでください。あなたのコメントに基づいて完全に編集されました。 – ChiefTwoPencils

関連する問題