Java中的等价名称

Mas*_*aus 24 java nameof

C#6.0引入了nameof()运算符,它返回一个字符串,表示放在其中的任何类/函数/方法/局部变量/属性标识符的名称.

如果我有这样的课程:

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

    public void MyMethod()
    {
        var aLocalVariable = 12;
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以像这样使用运算符:

// 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".
Run Code Online (Sandbox Code Playgroud)

这很有用,因为在编译时检查了正确的字符串.如果我拼错某些属性/方法/变量的名称,编译器将返回错误.此外,如果我重构,所有字符串都会自动更新.有关实际用例,请参阅此文档.

Java中是否有该运算符的等价物?否则,我怎样才能达到相同的结果(或相似)?

nas*_*kin 13

可悲的是,没有这样的事情.我一直在寻找这个功能,答案似乎是,一般来说,这个东西不存在.

请参阅获取字段的名称

当然,您可以使用"命名"注释来注释您的字段,从根本上为您自己的类完成此目标.实际上,有各种各样的框架依赖于类似的概念.即便如此,这也不是自动的.

  • Java 8 似乎情况发生了变化,我在下面分享了可能的解决方案。 (2认同)

jre*_*not 7

它可以使用运行时字节代码检测来完成,例如使用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));
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 那么我必须使用外部库吗?不,谢谢。这应该融入到 Java 语言中,并且能够在 Javadoc 注释中引用参数名称。 (2认同)

f1s*_*1sh 5

你不能.

您可以使用反射获取方法或字段,但您必须将方法名称硬编码为String,这样可以消除整个目的.

属性的概念不像在C#中那样内置于java中.吸气剂和制定者只是常规方法.您甚至无法像在问题中那样轻松地引用方法.您可以尝试使用反射来获取getter方法的句柄,然后切断get以获取它类似的"属性"的名称,但这很难看并且不一样.

至于局部变量,根本不可能.

  • @StephenP那是真的.但是,如果要获取特定名称的名称,则必须使用equals或contains检查方法的/字段名称,您必须再次键入名称作为字符串文字. (2认同)

mak*_*aki 5

Lombok 有一个实验性功能@FieldNameConstants

添加注释后,您将获得Fields带有字段名称的内部类型。

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

String s = MyClass.Fields.myProperty; // s == "myProperty"
Run Code Online (Sandbox Code Playgroud)