자바 코드 생 성기 제작 절차 상세 설명
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 소통 을 한다.
자바 코드 생 성기 의 제작 절차 에 대한 상세 한 설명 은 여기까지 입 니 다.더 많은 자바 코드 생 성기 제작 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.