Java 中等效名称

2022-09-01 02:09:11

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中是否有任何等效的运算符?否则,我如何获得相同的结果(或类似)?


答案 1

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

答案 2

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

请参阅获取字段名称

当然,您可以使用“命名”批注来批注您的字段,以基本上为您自己的类实现此目标。实际上,有各种各样的框架依赖于类似的概念。即便如此,这也不是自动的。


推荐