자바 코드 생 성기 제작 절차 상세 설명

7991 단어 Java코드생 성기

1.머리말
며칠 전에Mybatis Plus 코드 생 성기에 관 한 글 을 썼 는데 많은 친구 들 이 개인 적 으로 이 코드 생 성기 가 어떻게 작 동 하 는 지,왜 템 플 릿 엔진 을 사용 하 는 지 물 었 기 때문에 오늘 은 코드 생 성기 의 절 차 를 설명 하 겠 습 니 다.
2.코드 생 성기 의 사용 장면
우 리 는 인 코딩 에 많은 모델 코드 가 존재 하고 형식 이 비교적 고정 적 이 며 구 조 는 프로젝트 의 교체 에 따라 비교적 안정 적 이 며 수량 이 많다.이런 코드 는 많이 써 도 기술적 함량 이 없다.이런 상황 에서 코드 생 성 기 는 우리 의 효율 을 효과적으로 향상 시 킬 수 있 고 그 상황 은 코드 생 성 기 를 사용 하 는 데 적합 하지 않다.
3.코드 생 성기 제작 절차
우선 우 리 는 템 플 릿 을 만들어 서 모델 코드 의 고정 형식 을 추출 해 야 한다.그리고 동적 속성 을 템 플 릿 에 연결 하여 빈 문 제 를 푸 는 것 과 같 습 니 다.그래서 이 프로 세 스에 서 템 플 릿 엔진 이 가장 적합 하 다.우 리 는 템 플 릿 엔진 의 문법 을 사용 하여 데 이 터 를 정적 템 플 릿 에 동적 으로 해석 한 다음 프로 그래 밍 에 대응 하 는 파일 로 내 보 내 면 됩 니 다.
또한 템 플 릿 엔진 은 풍부 한 바 인 딩 데이터 명령 집합 을 가지 고 있 기 때문에 우 리 는 조건 에 따라 동적 으로 데 이 터 를 템 플 릿 에 연결 할 수 있 습 니 다.Freemarker 를 예 로 들 면:
삼원 식:

${true ? 'checked': ''}
그리고 우리 가 잠시 후에 사용 할 목록:

<#list fields as field>
 private ${field.fieldType} ${field.fieldName};
</#list>
자바 개발 에서 우리 가 자주 사용 하 는 템 플 릿 엔진 은 Freemarker,Velocity,Thymeleaf 가 있 습 니 다.웹 개발 에서 앞 뒤 가 분 리 된 유행 템 플 릿 엔진 의 사용 장면 이 압축 되 고 있 지만 유용 한 기술 입 니 다.
4.코드 생 성기 데모
다음 에 우 리 는 Freemarker 를 예 로 들 어 간단 한 코드 생 성 기 를 써 서 POJO 류 를 생 성 합 니 다.Freemarker 의 의존 도 를 도입 해 야 합 니 다.

<dependency>
 <groupId>org.freemarker</groupId>
 <artifactId>freemarker</artifactId>
 <version>2.3.28</version>
</dependency>
4.1 템 플 릿 제작
POJO 의 구 조 는 다음 과 같은 몇 부분 으로 나 눌 수 있다.

java.lang 패 키 지 는 가 져 올 필요 가 없습니다.
그래서 이 규칙 들 을 설정 클래스 에 패키지 합 니 다:

public class JavaProperties {
 //   
 private final String pkg;
 //   
 private final String entityName;
 //           equals hash               
 private final Set<Field> fields = new LinkedHashSet<>();
 //          
 private final Set<String> imports = new LinkedHashSet<>();


 public JavaProperties(String entityName, String pkg) {
  this.entityName = entityName;
  this.pkg = pkg;
 }

 public void addField(Class<?> type, String fieldName) {
  //    java.lang
  final String pattern = "java.lang";
  String fieldType = type.getName();
  if (!fieldType.startsWith(pattern)) {
   //     
   imports.add(fieldType);
  }
  Field field = new Field();
  //          
  int i = fieldType.lastIndexOf(".");
  field.setFieldType(fieldType.substring(i + 1));
  field.setFieldName(fieldName);
  fields.add(field);
 }

 public String getPkg() {
  return pkg;
 }


 public String getEntityName() {
  return entityName;
 }


 public Set<Field> getFields() {
  return fields;
 }

 public Set<String> getImports() {
  return imports;
 }

 
 /**
  *         .
  */
 public static class Field {
  //       
  private String fieldType;
  //       
  private String fieldName;

  public String getFieldType() {
   return fieldType;
  }

  public void setFieldType(String fieldType) {
   this.fieldType = fieldType;
  }

  public String getFieldName() {
   return fieldName;
  }

  public void setFieldName(String fieldName) {
   this.fieldName = fieldName;
  }
  
  /** 
   *                     
   *         equals hash        Set
   * 
   * @param o        
   * @return     
   */
  @Override
  public boolean equals(Object o) {
   if (this == o) return true;
   if (o == null || getClass() != o.getClass()) return false;
   Field field = (Field) o;
   return Objects.equals(fieldName, field.fieldName);
  }

  @Override
  public int hashCode() {
   return Objects.hash(fieldType, fieldName);
  }
 }

}
다음은 정적 템 플 릿 enity.ftl 입 니 다.

package ${pkg};

<#list imports as impt>
import ${impt};
</#list>

/**
 * the ${entityName} type
 * @author felord.cn
 */
public class ${entityName} {

<#list fields as field>
 private ${field.fieldType} ${field.fieldName};
</#list>

}
여기에 Freemarker 바 인 딩 데이터 의 문법 을 사 용 했 습 니 다.예 를 들 어 List 교체 렌 더 링 등 입 니 다.
4.2 생 성기 작성
Freemarker 는 설명 설정 을 통 해 템 플 릿 대상 freemarker.template 를 가 져 옵 니 다.이 대상 의 process 방법 은 동적 데 이 터 를 템 플 릿 에 연결 하고 파일 로 내 보 낼 수 있 습 니 다.최종 적 으로 코드 생 성 기 를 실 현 했 습 니 다.핵심 코드 는 다음 과 같 습 니 다.

/**
 *         .
 *
 * @param rootPath  maven   java   
 * @param templatePath         
 * @param templateName      
 * @param javaProperties          
 * @throws IOException  the io exception
 * @throws TemplateException the template exception
 */
public static void autoCodingJavaEntity(String rootPath,
           String templatePath,
           String templateName,
           JavaProperties javaProperties) throws IOException, TemplateException {

 // freemarker   
 Configuration configuration = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);

 configuration.setDefaultEncoding("UTF-8");
 //        
 configuration.setDirectoryForTemplateLoading(new File(templatePath));
 //               
 Template template = configuration.getTemplate(templateName);
 //       
 final String ext = ".java";
 String javaName = javaProperties.getEntityName().concat(ext);
 String packageName = javaProperties.getPkg();
 
 String out = rootPath.concat(Stream.of(packageName.split("\\."))
   .collect(Collectors.joining("/", "/", "/" + javaName)));
 
  //               
 OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(out));
  // freemarker                   
 template.process(javaProperties, outputStreamWriter);

}
다음 코드 를 실행 하면 UserEntity 의 POJO 를 생 성 할 수 있 습 니 다.

//              
String rootPath = "C:\\Users\\felord\\IdeaProjects\\codegenerator\\src\\main\\java";
String packageName = "cn.felord.code";
String templatePath = "C:\\Users\\felord\\IdeaProjects\\codegenerator\\src\\main\\resources\\templates";
String templateName = "entity.ftl";


JavaProperties userEntity = new JavaProperties("UserEntity", packageName);

userEntity.addField(String.class, "username");
userEntity.addField(LocalDate.class, "birthday");
userEntity.addField(LocalDateTime.class, "addTime");
userEntity.addField(Integer.class, "gender");
userEntity.addField(Integer.class, "age");


autoCodingJavaEntity(rootPath, templatePath, templateName, userEntity);
생 성 효과 가 손 으로 쓴 것 과 차이 가 많 지 않 습 니까?

5.총화
이것 이 바로 대부분의 코드 생 성기 의 메커니즘 이 므 로 일부 네티즌 들 의 질문 에 대답 할 수 있 기 를 바 랍 니 다.많은 관심:코드 농 뚱 이 형 은 더 많은 건어물 을 얻 을 수 있 습 니 다.관련 DEMO 는 공식 번 호 를 통 해 codegen 에 답장 하여 얻 을 수 있 습 니 다.궁금 한 게 있 으 면 위 챗 MSW 를 통 해623 소통 을 한다.
자바 코드 생 성기 의 제작 절차 에 대한 상세 한 설명 은 여기까지 입 니 다.더 많은 자바 코드 생 성기 제작 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기