如何通过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"
}
}
如何通过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"
}
}