如何通过Java反射获取接口类型中声明的变量中存储的实现类型class?

How can I get the type of the implementation class stored in the variable declared in the interface type by Java reflection?

如何通过Java反射获取接口类型中声明的变量中存储的实现类型class?

如果使用getDeclaredField()检查声明为List类型的列表变量的类型,它将被获取为List。

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

public class Test {
    
    private static List<String> list = new ArrayList<>();

    public static void main(String[] args) throws Exception {
        Field f = Test.class.getDeclaredField("list");
        String type = f.getType().getSimpleName();
        System.out.println(type); //output "List"
    }
}

有没有办法将其作为 ArrayList 获取?

当然不是。稍后,相同的变量可能包含完全不同的东西;也许某个地方的某些代码会执行 Test.list = new LinkedList<>()。你想知道的是没有答案的。

也许您想深入研究赋值表达式,但这也不是什么乐趣。看:

private static List<String> list = Math.random() > 0.5 ?
  new LinkedList<>() :
  new ArrayList();

你看这不是一个有有意义答案的问题。

您可以简单地使用 getClass() 方法代替 reflection

import java.util.ArrayList;
import java.util.List;

public class Test {
    private static List<String> list = new ArrayList<>();

    public static void main(String[] args) throws Exception {
        System.out.println(list.getClass().getSimpleName()); //ArrayList
    }
}

使用反射是可能的。需要读取赋值给变量的类型:

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

public class Test {

    private static List<String> list = new ArrayList<>();

    public static void main(String[] args) throws Exception {
        Field f = Test.class.getDeclaredField("list");
        String type = f.get(new Object()).getClass().getSimpleName();
        System.out.println(type); //output "ArrayList"
    }
}