본문 바로가기

Programing/JVM(Java, Kotlin)

이클립스의 자바빈 getter/setter 생성 버그

Foo라는 클래스의 String타입의 name이름의 프로퍼티가 있다고 할 때,

JavaBean 규약에 의하면 getter와 setter의 이름은 각각,

String getName()과 void setName()이 된다.


이클립스에서 POJO형태의 클래스를 만들때 보통 메소드 자동생성기능을 이용한다.

 Source > Generate Getters and Setters...


문제는 두번째 글자가 대문자일 경우에 이클립스는 첫 번째 문자를 대문자로 바꾸지 않고 소문자로 놔둔다는 것이다.

nName이라는 프로퍼티는 아래처럼 바뀐다.


별로 상관없을지 모르나  리플렉션(reflection)을 통해 메소드를 가져오는 경우 아래와 같은 메세지가 나오면서 예외가 발생한다.

java.beans.IntrospectionException: Method not found: isNName

       at java.beans.PropertyDescriptor.<init>(PropertyDescriptor.java:106)

       at java.beans.PropertyDescriptor.<init>(PropertyDescriptor.java:70)

       at com.tistory.namocom.FooTest.main(FooTest.java:10)


관련 샘플코드

public class Foo {

       private String name;

       private String nName;

 

       public String getName() {

             return name;

       }

 

       public void setName(String name) {

             this.name = name;

       }

 

       public String getnName() {

             return nName;

       }

 

       public void setnName(String nName) {

             this.nName = nName;

       }

}


import java.beans.IntrospectionException;

import java.beans.PropertyDescriptor;

 

public class FooTest {

       public static void main(String[] args) {

             try {

                    PropertyDescriptor propDesc =

                           new PropertyDescriptor("nName", Foo.class);;

                    System.out.println(propDesc);

             } catch (IntrospectionException ie) {

                    ie.printStackTrace();

             }

       }

}


예외에서는 isNName이라고 나오기는 하는데, 이것은 나중에 메소드 찾는 과정에서 getNName이라고 바뀐다.

따라서 getnName()을 getNName()으로 바꾸어주면 문제는 해결된다.



관련된 내용은 이클립스 버그리포트 페이지중 322223에서 확인할 수 있다.

 Generate Getter/Setter creates wrong names for fields having upper case second char


StackOverflow에서도 관련 내용이 있었다.

 Strange autogenerated getter and setter in eclipse