web-dev-qa-db-ja.com

親基本クラスオブジェクトsuper.getClass()を取得する方法

Java(C++プログラマであること))で少し問題があります。

私には2つの関連クラスがあります。

public class Patient() {
...
}

public class PatientPersistent extends Patient {
...
    public void foo() {
    System.out.println(super.getClass().toString());
    }
}

これは出力します:

クラスorg.example.smartgwt.server.model.PatientPersistent

親クラスのタイプを取得する方法はありますか?つまり.

クラスorg.example.smartgwt.server.model.Patient。

これにより、各子に実装する必要があるいくつかのメソッドを一般化できます。

ありがとう!


[〜#〜]更新[〜#〜]

Dozerを使用して、ドメインのHibernateオブジェクトをシリアル化可能なバージョンに変換しています。クライアントにこれを知らせたくないので、クライアントにはPatientクラスしか表示されません。サーバー側では、変換を実行します。

public class DataObject<Type> {

    private static final Class<Object> DstType = Type;

    public Object convert(Object srcData, final BeanFactory factory) {
        Mapper mapper = (Mapper)factory.getBean("dozerMapper");

        return (Object)mapper.map(srcData, DstType);
    }
}

public class Patient() implements Serializable {
    public Set foo;
}    

public class PatientPersistent extends Patient {

    public org.hibernate.collection.PersistentSet foo;
    DataObject<Patient> converter = new DataObject<Patient>;

    public Patient convertToSerializable(final BeanFactory factory) {
        return (Patient)converter.convert(this, factory);
    }
}

public class main() {
    // This object is not serializable so I cannot send it to the client
    PatientPersistent serializableBar = new PatientPersistent();

    // Using Dozer to copy the data PatientPersistent -> Patient
    // This will load the Dozer spring bean and copy as mapped
    Patient copiedSerializableData = serializableBar.convertToPersistent(bar, factory);
}

私はこのコードが機能しないことを知っていますが、それは私の主張をするだけです。 convertオブジェクトをシリアル化可能な形式にして、クライアントに返送できるようにしたいと考えています。だから親の型をあげたいと思います。 mapperを呼び出すと、ソースオブジェクトとDest.classは常に同じになります。

たぶん、私はJavaと混同されすぎています。

ありがとう

21
code-gijoe
getClass().getSuperclass()

ただし、これは使用しないでください。それは確かに悪いデザインの兆候です。

33
Bozho

Nice ... super.getClass()は、実際にはObjectのgetClass()であり、呼び出されたインスタンスの実行時のタイプを返します(この場合、this)。したがって、同じクラスを受け取ります...

スーパーの実装を使用してthisのランタイムクラスを要求する代わりに、getClassによって返されるクラスのスーパークラスを要求する必要があります。

getClass().getSuperclass()

そして、ところで、「これは私がひどいそれぞれの子供に実装する必要があるいくつかのメソッドを一般化することを可能にするでしょう」とはどういう意味ですか?他にデザインの選択肢がないと確信していますか?

8
Eyal Schneider

Object.getClass()はオブジェクトのruntimeタイプを返すため、superを呼び出しの前に追加してもあまり効果はありません。

getClass().getSuperclass()を使用できます。

7
Mike Daniels

試してください:getClass().getSuperclass().toString()

2

あなたが提案している方法で「マジック」を使用して問題を解決すると、あまり柔軟ではない解決策が得られることがよくあります。

スーパーのクラスを取得しようとしている場合、おそらく必要なのは、親の型を調べた後に実行しようとしたアクションを明示的に実装するメソッドを親のクラスで呼び出すことです。

さらに、現在実装しているメソッドが実際に親クラスにあり、そのメソッドが子クラスに実装されている抽象メソッドを参照している場合、デザインがさらに良くなる可能性があります。

もちろん、私は親のタイプを取得したいというあなたの願望からこれをすべて推測していますが、完全に間違っているかもしれませんが、親のクラスを知っているのがあなたが探している答えである場合、間違った質問をしていると思います-戻る数フィート上に、もう一度見てください。

1
Bill K