Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

nameof equivalent in Java

Tags:

java

nameof

C# 6.0 introduced the nameof() operator, that returns a string representing the name of any class / function / method / local-variable / property identifier put inside it.

If I have a class like this:

class MyClass {     public SomeOtherClass MyProperty { get; set; }      public void MyMethod()     {         var aLocalVariable = 12;     } } 

I can use the operator like this:

// 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 is useful since the correct string is checked at compile time. If I misspell the name of some property/method/variable, the compiler returns an error. Also, if I refactor, all the strings are automatically updated. See for example this documentation for real use cases.

Is there any equivalent of that operator in Java? Otherwise, how can I achieve the same result (or similar)?

like image 921
Massimiliano Kraus Avatar asked Nov 28 '16 18:11

Massimiliano Kraus


People also ask

Is there a Nameof in Java?

C# 6.0 introduced the nameof() operator, that returns a string representing the name of any class / function / method / local-variable / property identifier put inside it. I can use the operator like this: // with class name: var s = nameof(MyClass); // s == "MyClass" // with properties: var s = nameof(MyClass.

What is Nameof?

idiom. : used to indicate the name that is used for someone or something.


1 Answers

It can be done using runtime byte code instrumentation, for instance using Byte Buddy library.

See this library: https://github.com/strangeway-org/nameof

The approach is described here: http://in.relation.to/2016/04/14/emulating-property-literals-with-java-8-method-references/

Usage example:

public class NameOfTest {     @Test     public void direct() {         assertEquals("name", $$(Person.class, Person::getName));     }      @Test     public void properties() {         assertEquals("summary", Person.$(Person::getSummary));     } } 
like image 101
jreznot Avatar answered Oct 05 '22 00:10

jreznot