자바 효율 도구 Lombok 의 구체 적 인 사용

8746 단어 JavaLombok
지루 하고 지 키 기 힘 든 POJO 를 아직도 만 들 고 있 나 요?결벽 자의 봄 은 어디 에 있 습 니까?Lombok 보 세 요!
과거 자바 프로젝트 에는 너무 많은 불 친절 한 코드 가 가득 합 니 다:POJO 의 getter/setter/toString;이상 처리;I/O 흐름 의 닫 기 동작 등 이런 모델 코드 는 기술적 함량 도 없고 코드 의 미관 에 도 영향 을 주 며 Lombok 이 생 겨 났 다.
먼저 설명 하 자 면 모든 기술 의 등장 은 특정한 문 제 를 해결 하기 위 한 것 이다.만약 에 이 를 바탕 으로 기이 한 기 교 를 세우 면 자바 자체 로 돌아 가 는 것 이 낫다.남용 하지 말고 합 리 적 으로 사용 해 야 한다.
Lombok 의 사용 은 매우 간단 합 니 다.다음은 우리 함께 보 겠 습 니 다.
1)해당 Maven 가방 도입:

<dependency> 
 <groupId>org.projectlombok</groupId> 
 <artifactId>lombok</artifactId> 
 <version>1.16.18</version> 
 <scope>provided</scope> 
</dependency> 
Lombok 의 scope=provided 는 컴 파일 단계 에서 만 유효 하 며 가방 에 넣 을 필요 가 없다 는 것 을 설명 합 니 다.사실은 그렇습니다.롬 복 은 컴 파일 기간 에 롬 복 주 해 를 가 진 자바 파일 을 완전한 Class 파일 로 정확하게 컴 파일 합 니 다.
2)Lombok 에 대한 IDE 도구 지원 추가:
IDEA 에 Lombok 지원 을 도입 하면 다음 과 같 습 니 다.
File--Settings 설정 인터페이스 를 클릭 하고 Lombok 플러그 인 을 설치 합 니 다.

File--Settings 설정 창 을 클릭 하여 Annocation Processors 를 엽 니 다.

이 항목 을 여 는 것 은 Lombok 주석 이 컴 파일 단계 에서 작용 하도록 하기 위해 서 입 니 다.
Eclipse 의 Lombok 플러그 인 설 치 는 자체 바 이 두 를 사용 할 수 있 고 간단 합 니 다.특히 Eclipse 에 내 장 된 컴 파일 러 는 Oracle javac 가 아니 라 eclipse 가 자체 적 으로 실현 한 Eclipse Compiler for Java(ECJ)이기 때 문 입 니 다.ECJ 가 Lombok 을 지원 하려 면 eclipse.ini 설정 파일 에 다음 과 같은 두 가지 내용 을 추가 해 야 합 니 다.
-Xbootclasspath/a:[lombok.jar 소재 경로]
-javaagent:[lombok.jar 소재 경로]
3)롬 복 실현 원리:
자바 6 부터 자바 c 는 프로그램 이 이 API 를 실현 하면 자바 c 가 실 행 될 때 호출 될 수 있 는'JSR 269 Pluggable Annotation Processing API'규범 을 지원 하고 있다.
롬 복 은'JSR 269 API'를 구현 한 프로그램 이다.javac 를 사용 하 는 과정 에서 역할 을 하 는 구체 적 인 절 차 는 다음 과 같 습 니 다.
  • javac 는 소스 코드 를 분석 하여 추상 문법 트 리(AST)를 생 성 합 니 다
  • javac 컴 파일 과정 에서 JSR 269 의 Lombok 프로그램 을 호출 했 습 니 다
  • 이때 Lombok 은 첫 번 째 단계 에서 얻 은 AST 를 처리 하고 Lombok 주해 가 있 는 클래스 에 대응 하 는 문법 트 리(AST)를 찾 은 다음 에 이 문법 트 리(AST)를 수정 하여 Lombok 주해 가 정의 하 는 해당 트 리 노드 를 추가 합 니 다
  • javac 는 수 정 된 추상 문법 트 리(AST)를 사용 하여 바이트 파일 을 생 성 합 니 다
  • 4)롬 복 주해 의 사용:
    POJO 클래스 에서 자주 사용 하 는 주석:
    @Getter/@Setter:역할 클래스 에서 모든 구성원 변 수 를 생 성 하 는 getter/setter 방법;구성원 변수 에 작용 하여 이 구성원 변 수 를 생 성 하 는 getter/setter 방법.접근 권한 및 게 으 른 로드 여부 등 을 설정 할 수 있 습 니 다.
    
    package com.trace; 
    import lombok.AccessLevel; 
    import lombok.Getter; 
    import lombok.Setter; 
    /** 
     * Created by Trace on 2018/5/19.<br/> 
     * DESC:     
     */ 
    @SuppressWarnings("unused") 
    public class TestClass { 
      public static void main(String[] args) { 
      } 
      @Getter(value = AccessLevel.PUBLIC) 
      @Setter(value = AccessLevel.PUBLIC) 
      public static class Person { 
        private String name; 
        private int age; 
        private boolean friendly; 
      } 
      public static class Animal { 
        private String name; 
        private int age; 
        @Getter @Setter private boolean funny; 
      } 
     } 
    Structure 보기에 서 getter/setter 가 생 성 된 방법 을 볼 수 있 습 니 다.

    컴 파일 된 코드 는 다음 과 같 습 니 다.[이것 도 전통 자바 프로 그래 밍 에 필요 한 모델 코드 입 니 다]
    
    // 
    // Source code recreated from a .class file by IntelliJ IDEA 
    // (powered by Fernflower decompiler) 
    // 
    package com.trace; 
    public class TestClass { 
      public TestClass() { 
      } 
      public static void main(String[] args) { 
      } 
      public static class Animal { 
        private String name; 
        private int age; 
        private boolean funny; 
        public Animal() { 
        } 
        public boolean isFunny() { 
          return this.funny; 
        } 
        public void setFunny(boolean funny) { 
          this.funny = funny; 
        } 
      } 
      public static class Person { 
        private String name; 
        private int age; 
        private boolean friendly; 
        public Person() { 
        } 
        public String getName() { 
          return this.name; 
        } 
        public int getAge() { 
          return this.age; 
        } 
        public boolean isFriendly() { 
          return this.friendly; 
        } 
        public void setName(String name) { 
          this.name = name; 
        } 
        public void setAge(int age) { 
          this.age = age; 
        } 
        public void setFriendly(boolean friendly) { 
          this.friendly = friendly; 
        } 
      } 
    } 
    @ToString:클래스 에 작용 합 니 다.기본 toString()방법 을 덮어 씁 니 다.of 속성 을 통 해 일부 필드 를 한정 적 으로 표시 할 수 있 습 니 다.exclude 속성 을 통 해 일부 필드 를 제거 할 수 있 습 니 다.

    @EqualsAndHashCode:클래스 에 작용 하여 기본 equals 와 hashCode 를 덮어 씁 니 다.
    @NonNull:구성원 변수 와 매개 변수 에 주로 작용 합 니 다.표 지 는 비어 있 으 면 안 됩 니 다.그렇지 않 으 면 빈 포인터 이상 을 던 집 니 다.

    @NoArgsConstructor,@RequiredArgsConstructor,@AllArgsConstructor:클래스 에 작용 하여 구조 함 수 를 생 성 하 는 데 사 용 됩 니 다.staticName,access 등의 속성 이 있 습 니 다.
    staticName 속성 이 설정 되면 정적 인 방법 으로 인 스 턴 스 를 생 성 합 니 다.access 속성 은 접근 권한 을 제한 할 수 있 습 니 다.
    @NoArgsConstructor:무 참 구조 기 생 성;
    @RequiredArgs Constructor:final 과@NonNull 주 해 를 포함 하 는 구성원 변 수 를 생 성 하 는 구조 기;
    @AllArgs Constructor:전 삼 구조 기 생 성.

    컴 파일 후 결과:
    
    public static class Person { 
      @NonNull 
      private String name; 
      private int age; 
      private boolean friendly; 
      public String toString() { 
        return "TestClass.Person(name=" + this.getName() + ", age=" + this.getAge() + ")"; 
      } 
      @NonNull 
      public String getName() { 
        return this.name; 
      } 
      public int getAge() { 
        return this.age; 
      } 
      public boolean isFriendly() { 
        return this.friendly; 
      } 
      public void setName(@NonNull String name) { 
        if(name == null) { 
          throw new NullPointerException("name"); 
        } else { 
          this.name = name; 
        } 
      } 
      public void setAge(int age) { 
        this.age = age; 
      } 
      public void setFriendly(boolean friendly) { 
        this.friendly = friendly; 
      } 
      private Person() { 
      } 
      private static TestClass.Person of() { 
        return new TestClass.Person(); 
      } 
      @ConstructorProperties({"name"}) 
      Person(@NonNull String name) { 
        if(name == null) { 
          throw new NullPointerException("name"); 
        } else { 
          this.name = name; 
        } 
      } 
      @ConstructorProperties({"name", "age", "friendly"}) 
      public Person(@NonNull String name, int age, boolean friendly) { 
        if(name == null) { 
          throw new NullPointerException("name"); 
        } else { 
          this.name = name; 
          this.age = age; 
          this.friendly = friendly; 
        } 
      } 
    } 
    @Data:클래스 에 작용 하여 다음 주해 의 집합 입 니 다:@ToString@EqualsAndHashCode@Getter@Setter@RequiredArgs Constructor
    @Builder:클래스 에 작용 하여 클래스 를 건설 자 모드 로 전환 합 니 다.
    @Log:클래스 에 작용 하여 로그 변 수 를 생 성 합 니 다.서로 다른 로그 구현 제품 에 대한 설명 이 다 릅 니 다.

    기타 중요 한 주석:
    @Cleanup:자원 을 자동 으로 닫 습 니 다.자바.io.Closeable 인 터 페 이 스 를 실현 한 대상 에 게 유효 합 니 다.예 를 들 어 전형 적 인 IO 흐름 대상 입 니 다.

    컴 파일 후 결 과 는 다음 과 같다.

    너무 깔끔 한 거 아니 야?
    @Sneaky Throws:검 사 를 받 은 이상 을 포착 하여 던 질 수 있 습 니 다.상기 main 방법 은 다음 과 같 습 니 다.

    @Synchronized:방법 단계 에 작용 하여 synchronize 키워드 나 lock 자 물 쇠 를 교체 할 수 있 습 니 다.쓸모 가 없습니다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기