我知道Java中有各种反射功能。 例如:
CREATE TABLE my_info_list(
info_id INT,
list_id INT
);
CREATE TABLE my_info(
info_id INT,
info_risk_code varchar(5)
);
CREATE TABLE my_list(
list_id INT,
list_risk_code varchar(5)
);
INSERT INTO my_info_list VALUES (1,1);
INSERT INTO my_info_list VALUES (2,1);
INSERT INTO my_info_list VALUES (3,1);
INSERT INTO my_info_list VALUES (4,2);
INSERT INTO my_info_list VALUES (5,2);
INSERT INTO my_info_list VALUES (6,3);
INSERT INTO my_info_list VALUES (7,3);
INSERT INTO my_info VALUES (1,'400');
INSERT INTO my_info VALUES (2,'600');
INSERT INTO my_info VALUES (3,'400');
INSERT INTO my_info VALUES (4,'600');
INSERT INTO my_info VALUES (5,'600');
INSERT INTO my_info VALUES (6,'400');
INSERT INTO my_info VALUES (7,'400');
INSERT INTO my_list VALUES (1,'600');
INSERT INTO my_list VALUES (2,'600');
INSERT INTO my_list VALUES (3,'600');
我想知道我是否可以在<>中的某些方法声明中传递class dynamicaly标签(如果必须修复,还有其他方法可以做到)。我想动态地改变那个类声明;因为我想为所有类型编写泛型方法。
在那里,我有这个:
WITH RECURSIVE hierarchy(node, node_parent) AS (
SELECT node, node_parent
FROM tree
UNION ALL
SELECT t.node, h.node_parent
FROM hierarchy h
JOIN tree t ON h.node = t.node_parent
)
SELECT *
FROM hierarchy
WHERE NOT (node IN ( SELECT node_parent FROM tree where not node_parent is null)) and not node_parent is null
我可以用反射写出不同的东西吗?例如,可以以某种方式实现将类作为参数传递(或者应该如何完成此操作):
Class<?> clazz = Class.forName("java.util.Date");
Object ins = clazz.newInstance();
?我会很感激的例子。
答案 0 :(得分:1)
这是不可能的,因为泛型是编译时功能。编译代码后,唯一存在泛型的地方是方法签名,它们仅用于编译新代码。
使用反射时,您基本上使用原始类型,并且需要根据它进行编码,这意味着您可以将newInstance()
的返回结果强制转换为您需要的列表类型,例如:< / p>
List<Country> ins = (List<Country>)clazz.newInstance();
这是一个安全的操作,因为你知道那时它是空的,并且不会传递给任何外部代码。
答案 1 :(得分:0)
我不认为这是可能的。 Java中的泛型以禁止运行时访问的方式实现。
答案 2 :(得分:0)
泛型是存在的,因此编译器可以验证正确的类型,但在运行时不再存在(这称为“类型擦除”)。 Reflection仅处理类型的运行时表示。据我所知,反射必须处理泛型的唯一情况是找出子类的“固定”类型参数,例如:如果您有class Bar<T>
和class Foo extends Bar<String>
,则可以使用反射找出T
Bar
String
固定为Foo
的{{1}}。但是,这也是类文件中的信息。除此之外,反射只能看到或创建原始类型。