如何获得类的所有字段信息作为泛型接收



如何获取作为Generic接收的类的所有字段信息?

我给了Account.class作为GenericClass的构造函数,并执行t1.getClass().getDeclaredFields();命令来获取该类的字段信息。

但结果是,解密字段的大小为0。

调试结果显示以下结果。

result = {Field[21]@10835}
0 = {Field@10837} "private static final int java.lang.Class.ANNOTATION"
1 = {Field@10838} "private static final int java.lang.Class.ENUM"
2 = {Field@10839} "private static final int java.lang.Class.SYNTHETIC"
3 = {Field@10840} "private transient volatile java.lang.reflect.Constructor java.lang.Class.cachedConstructor"
4 = {Field@10841} "private transient java.lang.String java.lang.Class.name"
5 = {Field@10842} "private transient java.lang.Module java.lang.Class.module"
6 = {Field@10843} "private transient java.lang.String java.lang.Class.packageName"
7 = {Field@10844} "private final java.lang.Class java.lang.Class.componentType"
8 = {Field@10845} "private static java.security.ProtectionDomain java.lang.Class.allPermDomain"
9 = {Field@10846} "private transient volatile java.lang.ref.SoftReference java.lang.Class.reflectionData"
10 = {Field@10847} "private transient volatile int java.lang.Class.classRedefinedCount"
11 = {Field@10848} "private transient volatile sun.reflect.generics.repository.ClassRepository java.lang.Class.genericInfo"
12 = {Field@10849} "private static final java.lang.Class[] java.lang.Class.EMPTY_CLASS_ARRAY"
13 = {Field@10850} "private static final long java.lang.Class.serialVersionUID"
14 = {Field@10851} "private static final java.io.ObjectStreamField[] java.lang.Class.serialPersistentFields"
15 = {Field@10852} "private static jdk.internal.reflect.ReflectionFactory java.lang.Class.reflectionFactory"
16 = {Field@10853} "private transient volatile java.lang.Object[] java.lang.Class.enumConstants"
17 = {Field@10854} "private transient volatile java.util.Map java.lang.Class.enumConstantDirectory"
18 = {Field@10855} "private transient volatile java.lang.Class$AnnotationData java.lang.Class.annotationData"
19 = {Field@10856} "private transient volatile sun.reflect.annotation.AnnotationType java.lang.Class.annotationType"
20 = {Field@10857} "transient java.lang.ClassValue$ClassValueMap java.lang.Class.classValueMap"

账户信息如下。

@Entity
@Getter
@Setter
public class Account{
@Id
@GeneratedValue
@Column(name = "account_id", nullable = false)
private Long id;
// User ID
@Column(unique = true, nullable = false)
private String userid;
// username
private String username;
// user password
private String password;
// User Permissions
@Enumerated(EnumType.STRING)
private AccountRole role;

测试代码如下。

@SpringBootTest
class PlxEntityToExcelTest {

@Autowired
AccountRepository accountRepository;
@Autowired
AccountService accountService;
@Test
void basic() {
System.out.println("accountRepository = " + accountRepository);
Iterable<Account> all = accountRepository.findAll();
for (Account account: all) {
System.out.println("account = " + account);
}
}
@Test
void anyClass() {
Account account = new Account();
account.setUserid("test");
account.setUsername("username");
account.setPassword("qwer");
account.setRole(AccountRole.USER);
accountService.createAccount(account);
Iterable<Account> all = accountRepository.findAll();
GenericClass<Account> cn = new GenericClass<Account>(Account.class);
cn.entityToExcel((List<Account>) all);


}
public class GenericClass<T>{
private T t1;

public GenericClass(Class<T> specificClass) {
this.t1 = (T) specificClass;
}
private void createHeader(){
Field[] declaredFields = t1.getClass().getDeclaredFields();

}
public void entityToExcel(List<T> list) {
System.out.println("list = " + list);
createHeader();
}
}
}

如果我正确理解了您要做的事情,那么您正在尝试获取Account类的字段。在这种情况下,您不需要在GenericClass的构造函数中将clazz实例强制转换为Account实例,因此您只需要执行t1.getDeclaredFields();

以下是GenericClass 的正确更改代码

public class GenericClass<T>{
private Class<T> t1;

public GenericClass(Class<T> specificClass) {
this.t1 = specificClass;
}
private void createHeader(){
Field[] declaredFields = t1.getDeclaredFields();

}
public void entityToExcel(List<T> list) {
System.out.println("list = " + list);
createHeader();
}
}

最新更新