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".
这很有用,因为在编译时检查了正确的字符串。如果我拼错某些属性/方法/变量的名称,编译器将返回错误。此外,如果我重构,所有字符串都会自动更新。有关实际用例,请参阅this documentation。
Java中是否有该运算符的等价物?否则,我怎样才能获得相同的结果(或相似)?
答案 0 :(得分:11)
当然,您可以使用“命名”注释来注释您的字段,从根本上为您自己的类完成此目标。实际上,有各种各样的框架依赖于类似的概念。即便如此,这也不是自动的。
答案 1 :(得分:6)
你不能。
您可以使用反射获取方法或字段,但您必须将方法名称硬编码为字符串,这样可以消除整个目的。
属性的概念不像在C#中那样构建在java中。吸气剂和制定者只是常规方法。您甚至无法像在问题中那样轻松地引用方法。您可以尝试使用反射来获取getter方法的句柄,然后切断get
以获取它类似的“属性”的名称,但这很难看并且不一样。
至于局部变量,根本不可能。
答案 2 :(得分:6)
可以使用运行时字节代码检测来完成,例如使用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));
}
}
答案 3 :(得分:3)
你不能。
如果使用调试符号进行编译,那么.class文件将包含一个变量名表(这是调试器将变量映射回源代码的方式),但不能保证它会存在,并且它不会在运行时公开