如何动态地将类放入<>

时间:2016-02-16 08:14:34

标签: java arraylist reflection java-7 java-api

我知道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();

?我会很感激的例子。

3 个答案:

答案 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}}。但是,这也是类文件中的信息。除此之外,反射只能看到或创建原始类型。