2010-07-13 5 views
3

나는생성 게터/(다시) 자바에있는 호텔은

 

class MyClass { 
    @Get 
    @Set 
    protected int aValue; 
} 
 

를 작성하는 방법을 고려하고, 자동으로 get_aValue()와 set_AValue() 클래스 메소드를 생성하고있다.

나는이 가능성을 발견했다.

1a) 컴파일 타임에. 주석 처리기를 사용하여 MyClass.java를 개별적으로 처리 한 다음 새로운 MyClass.java를 작성하고 마지막으로이 .java를 나머지 .java (대체)로 사용하십시오.

1b) 컴파일시. 어노테이션 프로세서를 사용하여 MyClassGenerated.java 파일을 생성하고 get/set 메소드를 사용하여 새로운 클래스를 원래 MyClass의 서브 클래스로 만듭니다.

2) 런타임시. java.lang.instrument와 외부 도구 (예 : BCEL)를 사용하여 MyClass.class에 새 코드를 만듭니다.

음, 질문 있습니다 : 가능한 한 내가

A) 나는 다른 접근 방식 실종 (롬복 프로젝트 나 BCEL처럼) 타사 라이브러리를 사용하지 않는 것을 고려?

b) 어떤 접근 방식을 사용합니까? 아마도 그것은 이름의 문제)

비록

나는, 1B)를 (프로그램의 나머지는 대신 원래 MyClass에의 MyClassGeneradted 사용해야 깨끗하지

때문에 나는) (1A)를 사용합니다 같아요

2)는 (적어도 나를 위해) 정말로 어렵습니다.

+0

이렇게하지 마십시오. 결국 코드를 ​​작성하는 데 필요한 모든 라이브러리가 서로의 발가락을 밟고 작업을 수행하는 것을 금지하게됩니다. Windows에서 GUI를 사용하면 수행해야 할 작업을 수행 할 수없는 경우와 매우 비슷합니다. –

+0

접근 자 메소드의 올바른 이름은'getAValue'와'setAValue'입니다. – whiskeysierra

답변

4

당신은 가장 좋은 방법은 내가 말하고 싶지만 어떤 일을한다 누락되었습니다.클래스를 정상적으로 컴파일 한 다음 APT 주석 프로세서를 사용하여 .class 파일 (소스 파일 아님)을 수정하여 적절한 get 및 set 메소드를 바이트 코드에 추가합니다.

소스가 원시 상태로 유지되므로 임시 파일에 대해 신경 쓸 필요가 없으며 실제 컴파일 된 클래스는 원했던 그대로입니다.


그래도 이것은 너트를 열기 위해 슬레지 해머를 사용하고 있습니다. 그것은 할 수있는 일이지만, 코드가 엄격하게 Java가 아니라는 점에서 누군가가 그것을 가져 와서 javac을 실행하면 getters와 setter없이 클래스를 얻을 수 있습니다. 이렇게하면 모든 행 번호가 엉망이되어 디버깅이 어려워집니다. 주석 처리기로 올바른 작업을 수행하지 않으면 getter 및 setter의 소스를 볼 수 없습니다. 실수를 바로 잡기. 정적 분석 도구는 속성이 사용되지 않는다는 것을 알려줍니다.

나는 모든 합의에 따라 모든 IDE에서 제공하는 방법을 사용하여 소스 파일에서 생성합니다. 이것은 주석을 쓰는 것보다 더 이상 시간이 걸리지 않으며, 모든 개발자와 도구가 이해할 수 있습니다. Java에는 속성이 없습니다. :-)

+0

나는 언어를 바꾸거나 (스칼라는 아주 멋지다), 삶을 편하게 만들거나, 더 나은 IDE로 전환하여 보일러 플레이트를 채우는 것에 동의한다. 아마 당신의 요구 사항에 더 많은 것, 당신은 자바 소스를 생성해야하고, 아마 주어진 형식으로 소스를 얻을 수 있나요? –

+0

"Java에 속성이 없습니다"라는 점에 동의합니다. 새로운 제안에 감사드립니다, 나는 몰랐다. .java 파일 대신 .class 파일을 적절한 방법으로 처리 할 방법을 찾아 보겠습니다. – cibercitizen1

5

getter 및 setter 메서드를 생성하기위한 많은 작업이 들리는 것 같습니다. 왜 그냥 eclipses getter and setter generator를 사용

generate getters and setters screenshot

+0

제 질문에 @Get @Set 요구 사항을 놓친 것 같아요. – cibercitizen1

+0

IDE를 사용하여 빌드 프로세스에서 모든 종류의 부두가 생기는 것을 피하십시오. 언젠가는 고마움을 느낍니다. –

+0

고마워.하지만, IDE를 바꿀 때, 나는 대부분의 시간을 사용한다.어쨌든, 저는 편집자와 무관 한 무언가를 선호합니다. – cibercitizen1

3
  • 가) 당신은 내가
스칼라에 쓰기 것이다 )
  • B
  • 것을 지원하는 자바 (호환되는 JVM 언어)를 사용할 수 있습니다

    심각하게 말하면 언어의 고통을 느끼고 바이트 코드 제작자 또는 외부 라이브러리와 같은 목발을 사용하고 싶지 않다면 더 푸르른 목초지를 찾아야합니다.

    +1

    Seconded. 스칼라를 살펴보면 Java와 충분히 유사하므로 잃어버린 느낌이 들지 않지만 getter와 setter를 명시 적으로 코딩해야 할 필요성이 없어집니다. 보일 수없는 죽음! 음, 내 혁명적 인 열정을 용서해주십시오. –

    +0

    이들은 Java가 아닙니다. :-( – cibercitizen1

    +0

    @ cibercitizen1 - 당신이보고있는 레벨에 따라 다르지만 자바 * 소스 코드가 아니지만 자바 * 클래스 *입니다. 자바로 작성된 클래스에서 스칼라로 작성된 클래스를 호출 할 수 있습니다 "네이티브"클래스처럼 자연스럽지 만 스칼라에서는 다른 구문을 사용할 수 있습니다. ** 당신의 질문에 ** 정확히 당신이 원하는 ** 것입니다. –

    3

    실질적으로 말하면, 일반적으로 접근법 3을 사용합니다. 필드를 코딩하고 Eclipse IDE를 사용하여 getter 및 setter 메소드를 자동 생성합니다. (netbeans와 IntelliJ는 비슷한 기능을 가지고 있어야합니다.)

    IDE의 자동 생성 도구를 사용하면 생성 된 getter/setter 메소드의 가시성을 정의 할 수도 있습니다 (설정자 가시성을 private로 제한 할 수도 있습니다). 필요할 경우 템플릿을 편집 할 수도 있습니다 추가 코드는 메소드 본문입니다.

    1C) 컴파일시 :이 경로를 아래로 이동하려면

    +0

    나는 이클립스를 사용하지 마십시오 :-(. 내 질문에 @Get @Set 요구 사항을 놓친 것 같아. – cibercitizen1

    +0

    @ cibercitzen1 - 그렇습니다. 간단히 말해서 @Get과 @Set은 강력합니다 * 요구 사항 *입니다. 하지만 eclipse, netbeans, JDeveloper, IntelliJ와 같은 IDE를 사용하는 것이 어떻습니까? –

    +0

    음, 저는 보통 vi 나 emacs를 사용합니다. 그러나 주된 이유는 편집자와 무관 한 무언가를 원한다는 것입니다. – cibercitizen1

    1

    다른 명백한 선택이 제안되지 않은 이유를 모르겠지만 인터페이스를 정의하고 지정된 setter, getters 및 필요한 내부 필드를 구현하는 라이브러리를 사용하는 다른 접근 방법을 고려해 볼 수 있습니다. .

    그래서 당신은

    같은 것을 지정합니다

    공용 인터페이스 콩 { 공공 INT getX(); 공공 무효의 setX (int 값); }

    및 유형에 인스턴스를 생성하도록 라이브러리에 요청합니다 (유형의 인스턴스를 만드는 데 편리한 메소드 일 수 있음). 필요한 경우 주석은 필요에 따라 추가 구성에 사용할 수 있지만 대/소문자가 아닌 스타일 bean을 가져 오거나 설정하는 데 사용할 수 있습니다.

    이것은 (2)와는 다르며, 뭔가 빠뜨린 것이 아니라면 그대로 작동하지 않습니다. 문제는 컴파일하는 동안 사용할 수있는 방법이 있어야한다는 것입니다. 이것이 인터페이스 사용으로 해결할 수 있습니다. 코드 생성이 필요하지만 자동화 될 수 있습니다.

    그런 라이브러리가 존재할 것으로 기대하지만 그렇지 않다면 바이트 코드 생성 라이브러리 (asm, cglib, janino, javassist 등)를 사용하여 범용 라이브러리를 작성해야합니다.

    간단한 사용 사례를위한 그런 라이브러리를 작성하는 것은 당연히 무겁다.하지만 하나를 사용하는 것은 의미있는 것처럼 보일 것이다.

    ... IDE를 사용하면 특정 사례를 해결하는 것이 가장 쉽습니다. :-)