롬복은 어떻게 작동합니까?


148

나는 오늘 롬복을 만났다 .
그것이 어떻게 작동하는지 알고 싶어합니다.
Java Geek Article 은 몇 가지 단서를 제공하지만 완전히 명확하지는 않습니다.

Java 6은 apt를 제거하고 javac가 주석을 관리 할 수있게하여 프로세스를 간소화하여보다 간단한 단일 단계 컴퓨팅을 얻습니다. 이것은 롬복이 찍은 길입니다.

Java 6의 경우 컴파일 프로세스는 다음과 같습니다. javac-> apt-> lombok apt process-> 클래스 파일 읽기 및 ASM을 사용하여 set / get 메소드 추가 .

메커니즘에 대한 자세한 내용을 알려 주시겠습니까?


답변:


135

Sean Patrick Floyd가 말했듯이 롬복은 실제로 내부 API에 대해 코드를 작성합니다. 그러나 롬복은 컴파일 단계 에만 관여하기 때문에 롬복은 햇볕 VM에서만 작동한다고 오해의 소지가 있습니다. ecj 또는 sun의 javac에서만 컴파일됩니다. 그러나 컴파일러를 전혀 제공하지 않는 대다수의 VM은이 두 가지 중 하나입니다. 예를 들어, Apple VM은 주식 선 javac와 함께 제공되며 롬복은 맥에서 잘 작동합니다. 예를 들어 soylatte VM도 마찬가지입니다.

javac의 경우 우리는 실제로 업데이트를 고수해야하지만, 지금은 컴파일러에 대한 많은 작업이 있었기 때문에 많은 버전의 일식에 대한 일식 지원을 약간만 조정해야했습니다. 따라서 내부 API에 대해 코드를 작성하는 동안 비교적 안정적인 비트입니다.

내부 API에 의존하지 않고 롬복이 수행 할 수 있다면 다른 작업을 수행했을 수 있지만 수행 할 수 없으므로 내부 API 사용에 의존합니다.

NB : 저는 롬복의 주요 개발자 중 한 명이므로 약간 편견이 있습니다.


7
출처 (+1)의 의견이 훌륭합니다. 나는 달리기에 관한 나의 진술이 오도되었다는 것을 인정한다. Lombok은 Sun VM에서만 실행할 수 있지만 결과 코드는 물론 플랫폼 중립적입니다.
Sean Patrick Floyd

주석 프로세서가 JavaC를 통해 실행되는 경우에도 호출 프로세서가 하나 뿐인 경우에도 모든 것을 Eclipse 컴파일러에 위임 할 수 있는지 궁금합니다.
Archimedes Trajano

@ rzwitserloot : 그래서 내가 정말 좋아하는 이유입니다. 핵심 개발자 자신의 진정한 답변.
gaurav

78

그것은 사용 JSR 269 플러그 주석 처리 API 자바 6에서 사용할 수 있습니다.

lombok.jar라는 파일 이 포함되어 있습니다 /META-INF/services/javax.annotation.processing.Processor. javac컴파일 클래스 경로에서이 파일을 볼 때 컴파일 중에 정의 된 주석 프로세서를 실행합니다.


좋은 답변 @axtavt!
gaurav

54

axtavt의 답변에 대한 부록 : 롬복은 JSR 269 API 노출보다 훨씬 더 많이 사용합니다. a) 내부 javac API 및 b) 내부 이클립스 api (별도의 프로세서)에 대한 롬복 코드. JSR 269에서는 기존 소스 코드를 수정할 수 없지만 Element기본 AST 노드에 캐스트 할 때 실제로 AST (프로젝트 롬복이 수행하는 작업)를 수정할 수 있습니다.

따라서 Lombok은 Sun VM (afaik) 에서만 컴파일을 실행 하는 거대한 핵입니다 . 이 소프트웨어는 훌륭한 소프트웨어이지만 비표준 해킹으로 인해 많은 사람들이 싫어합니다.


1
여전히 유효한 정보입니까?
Ondra Žižka

1
예. 사실입니다.
숀 패트릭 플로이드

@SeanPatrickFloyd 부록 : 아직 OpenJDK 11로 롬복 주석을 컴파일하는 데 아무런 문제가 없었습니다.
orithena

1
@orithena 예, 작동합니다. 두 번째 주석 프로세서를 도입하지 않고 롬복이 다른 프로세서가 찾을 것으로 예상되는 AST를 변경하기 때문에 갑자기 경쟁 조건에 빠지지 않습니다.
Sean Patrick Floyd

2
"Groovy / Kotlin은 자체 풀블로운 컴파일러를 제공하므로 바이트 코드 생성을 처리 할 것이므로 다른 컴파일러의 (Java Compiler) 바이트 코드 생성 프로세스를 해킹 할 필요가 없습니다."
임의의 친구

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.