如下
java
import org.springframework.util.AntPathMatcher;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
/**
* generate reflection-config.json for native-image
* @author cjbi
*/
public class ReflectionConfigGenerator {
public static void main(String[] args) throws Exception {
String[] patterns = {
"tech.wetech.metacode.application.dto.*",
"tech.wetech.metacode.domain.**.model.*",
"tech.wetech.metacode.domain.**.event.*",
"tech.wetech.metacode.infrastructure.jackson.JacksonUtils",
"tech.wetech.metacode.application.dto.SessionDataDTO",
"tech.wetech.metacode.infrastructure.jackson.BaseEntitySerializer",
"tech.wetech.metacode.infrastructure.jsonlogic.JsonLogicUtils",
"tech.wetech.metacode.infrastructure.pinyin4j.Pinyin4jUtil",
"tech.wetech.metacode.infrastructure.cache.NotABeanKeyGen"
};
ReflectionConfigGenerator generator = new ReflectionConfigGenerator();
generator.generateAndPrintConsole(patterns);
}
private void generateAndPrintConsole(String... patterns) throws Exception {
List<File> classsFileList = getClasssFileList();
AntPathMatcher antPathMatcher = new AntPathMatcher();
StringBuilder sb = new StringBuilder("[");
for (File file : classsFileList) {
String classPath = ReflectionConfigGenerator.class.getClassLoader()
.getResource("").getFile()
.replaceFirst("/", "")
.replace("/", "\\");
String className = file.getPath().replace(classPath, "").replace("\\", ".").replaceAll(".class", "");
for (String pattern : patterns) {
if (antPathMatcher.match(pattern, className)) {
sb.append(String.format("""
{
"name" : "%s",
"allDeclaredConstructors" : true,
"allPublicConstructors" : true,
"allDeclaredMethods" : true,
"allPublicMethods" : true,
"allDeclaredFields" : true,
"allPublicFields" : true
},""", className));
}
}
}
sb.deleteCharAt(sb.length() - 1);
sb.append("]");
System.out.println(sb);
}
private List<File> getClasssFileList() throws URISyntaxException, IOException {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
Enumeration<URL> urls = classLoader.getResources("");
List<File> fileList = new ArrayList<>();
while (urls.hasMoreElements()) {
URL url = urls.nextElement();
if (url.getProtocol().equals("file")) {
File file = new File(url.toURI());
listFiles(file, fileList);
}
}
return fileList;
}
private void listFiles(File rootFile, List<File> classFiles) {
File[] files = rootFile.listFiles();
assert files != null;
for (File file : files) {
if (file.isFile() && file.getName().endsWith(".class")) {
classFiles.add(file);
} else if (file.isDirectory()) {
listFiles(file, classFiles);
}
}
}
}