40

C# 6.0 では、nameof()内部に配置された任意のクラス / 関数 / メソッド / ローカル変数 / プロパティ識別子の名前を表す文字列を返す演算子が導入されました。

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

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".

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

Javaにその演算子に相当するものはありますか? それ以外の場合、どうすれば同じ結果 (または同様の結果) を得ることができますか?

4

6 に答える 6

6

You can't.

You can get a Method or Field using reflection, but you'd have to hardcode the method name as a String, which eliminates the whole purpose.

The concept of properties is not built into java like it is in C#. Getters and setters are just regular methods. You cannot even reference a method as easily as you do in your question. You could try around with reflection to get a handle to a getter method and then cut off the get to get the name of the "property" it resembles, but that's ugly and not the same.

As for local variables, it's not possible at all.

于 2016-11-28T18:24:37.617 に答える
2

できません。

デバッグ シンボルを使用してコンパイルすると、.class ファイルには変数名のテーブルが含まれます (これは、デバッガーが変数をソース コードにマップする方法です) が、これが存在するという保証はなく、実行時に公開されません。

于 2016-11-28T18:32:14.153 に答える
0

Lombok には実験的な機能があります@FieldNameConstants

注釈を追加するFieldsと、フィールド名を持つ内部型が取得されます。

@FieldNameConstants
class MyClass {
 String myProperty;
}
...

String s = MyClass.Fields.myProperty; // s == "myProperty"
于 2022-02-03T07:29:03.297 に答える