2016-11-28 2 views
7

C#6.0は、nameof()演算子を導入しました。この演算子は、クラス、関数、メソッド、ローカル変数、プロパティ識別子の名前を表す文字列を返します。Java内の同等の名称

私はこのようなクラスがある場合:

class MyClass 
{ 
    public SomeOtherClass MyProperty { get; set; } 

    public void MyMethod() 
    { 
     var aLocalVariable = 12; 
    } 
} 

私はこのような演算子を使用することができます:正しい文字列はコンパイル時にチェックされているので

//with class name: 
var s = nameof(MyClass); // s == "MyClass" 

//with properties: 
var s = nameof(MyClass.OneProperty); // s == "OneProperty" 

//with methods: 
var s = nameof(MyClass.MyMethod); // s == "MyMethod" 

//with local variables: 
var s = nameof(aLocalVariable); // s == "aLocalVariable". 

これは便利ですが。いくつかのプロパティ/メソッド/変数の名前を間違えた場合、コンパイラはエラーを返します。また、私がリファクタリングすると、すべての文字列が自動的に更新されます。実際の使用例については、例えばthis documentationを参照してください。

Javaにその演算子に相当するものはありますか?そうでなければ、私はどのようにして同じ結果(または同様のもの)を達成できますか?

+2

Javaは全く同じものを持っていないかなり確信しています。だからpre C#6のように、代わりに文字列リテラルを使う必要があるでしょう。 – juharr

+0

'nameof'はC#(6)の最新バージョンに追加された構文砂糖です。私はかなりJava(または一般的に最も一般的な言語)に相当するものはないと確信しています。 – Abion47

+5

この機能を使用して解決しようとしている問題は何ですか? – OldProgrammer

答えて

9

悲しいことに、このようなものはありません。私はこの機能をしばらく前から探していましたが、答えは一般的に言えば、このものは存在していないようでした。

あなたは、もちろん、基本的に独自のクラスのためにこの目標を達成するために、「名前」注釈を使用してフィールドに注釈を付けることができGet name of a field

参照してください。同じような概念に依存するフレームワークは、実際には多種多様です。それでも、これは自動ではありません。

6

できません。

リフレクションを使用してメソッドやフィールドを取得することはできますが、メソッド名を文字列としてハードコードする必要があります。

プロパティの概念は、C#のようにJavaに組み込まれていません。ゲッターとセッターは単なる通常のメソッドです。あなたの質問と同じように簡単にメソッドを参照することはできません。あなたは反射を使ってゲッターメソッドのハンドルを取得してから、getを切り捨てて、それが似ている「プロパティ」の名前を取得することができますが、それは醜く、同じではありません。

ローカル変数については、まったく不可能です。

+1

この質問はC#のプロパティとは関係ありません。質問は、名前自体を使用せずにメソッドまたはフィールドの名前を取得できるかどうかを確認することです。メソッドまたはフィールドを取得するために名前を必要とするリフレクションについてのあなたの要点は密接です。 –

+0

質問はC#のプロパティを非常に具体的に言及しています。私はその質問に「いいえ」と答えました。だからなぜdownvote?また、「ゲルマン」とはどういう意味ですか? – f1sh

+1

私はC#のプロパティについて言及しましたが、明らかにJavaでは存在しません。それは一例に過ぎません。私の質問のポイントは、クラスメンバー/変数/フィールド/識別子の文字列表現を取得することです、あなたはいくつかの有用なもので答えました。 –

3

できません。

デバッグシンボルを使用してコンパイルすると、.classファイルには変数名のテーブル(デバッガが変数をソースコードにマップする方法)が含まれますが、これがそこに存在することは保証されず、ランタイム。

+0

まず、コンパイルされたコードに含まれ、リフレクションを通して公開されているクラス、メソッド、フィールドの名前について質問します。 –

+1

@AndyThomasいいえ、そうではありません。正しい答えをdownvoting停止します。 – f1sh

+0

good going @ f1sh –

3

これは、たとえばByte Buddyライブラリを使用して、ランタイムバイトコード計測を使用して行うことができます。

このライブラリを参照してください:https://github.com/strangeway-org/nameof

アプローチがここで説明されています。http://in.relation.to/2016/04/14/emulating-property-literals-with-java-8-method-references/

使用例:

public class NameOfTest { 
    @Test 
    public void direct() { 
     assertEquals("name", $$(Person.class, Person::getName)); 
    } 

    @Test 
    public void properties() { 
     assertEquals("summary", Person.$(Person::getSummary)); 
    } 
}