gpt4 book ai didi

java - javassist中如何判断字段的类型是Map还是Collection

转载 作者:行者123 更新时间:2023-11-30 06:59:11 26 4
gpt4 key购买 nike

我使用 javassist 生成代码。

现在我需要找到实现Map或Collection(Set或List)的字段,我在javassist教程中找不到key,怎么办?非常感谢!

最佳答案

基本上,您必须迭代所有字段,获取每个字段类型的所有父类(super class)和接口(interface),并检查您需要的类型。

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

关于java - javassist中如何判断字段的类型是Map还是Collection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41241733/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com