3

継承されたクラスをフラット化して、どの関数がどのクラスに属しているかを発見する方法はありますか?

次のようなクラスがある場合:

public class Person
{
    public String name;

    public void setName(String name){
        this.name = name;
    }

    public String getName(){
        return this.name;
    }
}

そして継承されたクラス

public class Worker extends Person
{
    public String job;

    public void setJob(String job){
        this.job = job;
    }

    public String getJob(){
        return this.job;
    }
}

Worker をインスタンス化するときに、Set/GetName が Person クラスに属していることを確認する方法はありますか?

この情報を見つけるためにインターフェイスを使用するという提案を見てきましたが、ここで関数の関係の種類を示すためにインターフェイスをどのように使用するのが最適かはわかりません。継承されたクラス内の特定のクラスを参照できるようにするためのチートはありますか?

編集:

なぜ私がこれをしたいのか答えるために:私は基本的に、オブジェクト内のメソッドをループして、特定のクラスから来るものを無視できるようにしたいのですが、この例では Person クラスを無視したいのです。

私の実際の例はこれほど単純ではありませんが、どのメソッドがどのクラスに属しているかを「フラット化」せずに調べるより良い方法は思いつきませんでした。

4

3 に答える 3

6

クラスのisBridgeメソッドを使用して、メソッドがまたはクラスMethodで宣言されているかどうかを確認できます。PersonWorker

public static void main(String[] args) 
{
    Worker worker = new Worker();
    Class clazz = worker.getClass();
    Method[] methods = clazz.getDeclaredMethods();

    for(Method method :methods)
    {
        System.out.println(method.getName()+ " is in Worker: "+ !method.isBridge());
    }
}

上記のコードは、次のような出力を生成します。

setName is in Worker: false
getName is in Worker: false
setJob is in Worker: true
getJob is in Worker: true
于 2013-05-20T12:31:23.013 に答える
1

私があなたの問題を理解していれば、次の方法を試すことができます:

Class c = new Worker().getClass();
Method[] ma = c.getMethods();

for (Method m : ma) {
    String methodClass = m.getDeclaringClass().getName();
    if(methodClass.equals("net.yourpackage.Person")){
        // do something...
    }
    else if(methodClass.equals("net.yourpackage.Worker")){
        // do something...
    }
    // ... other classes
    else if(methodClass.equals("java.lang.Object")){
        // do something else...
    }
}
于 2013-05-20T14:04:01.913 に答える