1
javassist를 사용하여 코드를 생성합니다.필드의 유형을 판단하는 방법은 javassist의 Map 또는 Collection입니다.
이제 Map 또는 Collection (Set 또는 List)을 구현하는 필드를 찾아야합니다. javassist 튜토리얼에서 키를 찾을 수 없습니까? 매우 감사합니다!
javassist를 사용하여 코드를 생성합니다.필드의 유형을 판단하는 방법은 javassist의 Map 또는 Collection입니다.
이제 Map 또는 Collection (Set 또는 List)을 구현하는 필드를 찾아야합니다. javassist 튜토리얼에서 키를 찾을 수 없습니까? 매우 감사합니다!
기본적으로 모든 필드를 반복하고 각 필드 유형의 모든 수퍼 클래스와 인터페이스를 가져와 필요한 유형을 확인해야합니다.
는package hello;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtField;
import javassist.NotFoundException;
import java.util.*;
import java.util.stream.Collectors;
class Test {
public ArrayList arrayList;
public List list;
public HashSet hashSet;
public Set set;
public HashMap hashMap;
public Map map;
public Object object;
}
class Main {
public static void main(String[] args) throws Exception {
CtClass testClass = ClassPool.getDefault().get("hello.Test");
for (CtField ctField : testClass.getFields()) {
CtClass type = ctField.getType();
Set<String> allSupper = getAllSuperclasses(type)
.stream()
.map(CtClass::getName)
.collect(Collectors.toSet());
if (allSupper.contains(Map.class.getCanonicalName())){
System.out.format("field %s is a Map\n", ctField.getName());
}
if (allSupper.contains(Collection.class.getCanonicalName())){
System.out.format("field %s is a Collection\n", ctField.getName());
}
}
}
private static Set<CtClass> getAllSuperclasses(CtClass ctClass) throws NotFoundException {
HashSet<CtClass> ctClasses = new HashSet<>();
while (ctClass != null){
ctClasses.add(ctClass);
CtClass[] interfaces = ctClass.getInterfaces();
Collections.addAll(ctClasses, interfaces);
ctClass = ctClass.getSuperclass();
}
return ctClasses;
}
}
그것은 작동
field arrayList is a Collection
field list is a Collection
field hashSet is a Collection
field set is a Collection
field hashMap is a Map
field map is a Map
인쇄합니다! 감사합니다! – Gradle