2017-01-24 11 views
1

静的メソッドへのアクセスに使用されたクラスの名前を計算することはできますか?java get静的メソッドのクラス名

より良い質問を理解するために:

class S { 
    public static String method() { 
     return "S";// TODO compute class name here 
    } 
} 

class S1 extends S { 
} 

class S2 extends S { 
} 

public class Main { 
    public static void main(String[] args) { 
     System.out.println(S.method()); //should print S 
     System.out.println(S1.method()); //should print S1 
     System.out.println(S2.method()); //should print S2 
    } 
} 

を私はどちらもスタックトレースNOR型パラメータの技術を使用することはできませんようです。

おかげ

+0

@DVargaこれはまったく異なる質問です。 – dasblinkenlight

+0

[getName()](https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getName())がありますが、この特殊なケースは解決しません。 –

+1

あなたはこれを求めているのですか、それとも別の問題を解決しようとしますか?この機能の目的は何ですか? – Tom

答えて

0

質問は本当に意味がない - メソッドを呼び出す()それぞれの場合にSを出力します - それは呼ばれているのと同じ方法であるためです。あなたは次を望みますか?

System.out.println(S1.class.getSimpleName()); 
+0

そしてOPはそれが「S1」であり、「S2」ではないことをどのように知っていますか?答えにその部分を追加する必要があります。 – Tom

2

S1.methodS2.methodどちらもバイトコードに存在するので、あなたは、これを行うことはできません。呼び出しに使用できる唯一の方法は​​です。コンパイラは3つの呼び出しをすべて解決し、例の3つの呼び出しすべてに対して同じinvokestaticバイトコードを生成します。

0

あなたはわかりません。サブクラスから呼び出す場合でも、呼び出されている同じクラスの同じメソッドです。 IDEはコードをリファクタリングして、3つのインスタンスすべてがS1またはS2の代わりにSを参照するように提案することがあります。

あなたはこのような何かをしたい場合は、

public static String method(Class<S> c) { 
    .... 
} 

を考慮し、あなたはこれをしたい理由を検討することと非静的に行くことであるかどう

S.method(S2.class) 

でそれを呼び出しますこれを簡単にするための助け

関連する問題