Java的。我怎样才能使用反射?

时间:2011-10-19 12:12:08

标签: java reflection

我有两个类UpObj和DownObj

public class UpObj {

    public UpObj() {
        System.out.println("Load UpObj ");
    }

}

public class DownObj extends UpObj {

    public DownObj() {
        System.out.println("Load DownObj ");
    }

}

public class Caller {

    UpObj obj;

    public Caller(UpObj obj) {
        this.obj = obj;
        System.out.println("!!!");
    }

}

public class GNUMakeFile {

    /**
     * @param args
     */
    public static void main(String[] args) {
        DownObj iView = new DownObj();
        Class<?> iViewClass = iView.getClass();
        Class<?> clazz;
        try {
            clazz = Class.forName("bla.bla.bla.Caller");
            Constructor<?> ctor = clazz.getDeclaredConstructor(iViewClass);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }

    }

}

所以,我希望upcast我的孩子在Caller构造函数中键入DownObj to parent UpObj。 我认为这可以通过帮助泛型来实现。像这样的东西。 任何人都知道这是如何使用的。

感谢。

3 个答案:

答案 0 :(得分:0)

没有标准的做法。尝试谷歌搜索一些解决方案,例如http://www.xinotes.org/notes/note/1329/How to get parameter types using reflection?。我记得Spring和其他一些库有类似的util函数来做。你使用Spring吗?

答案 1 :(得分:0)

您不应该将Class.getConstructor()与您想要传递给它的运行时类型一起使用 - 该方法可以使用形式参数。

如果您需要搜索与您拥有的某些对象匹配的构造函数,则必须循环getConstructors(),检查每个构造函数的形式参数,并使用{检查是否找到了合适的签名{3}}。我认为没有一种方便的方法让反射API为你做重载解析。

(或者,重新考虑你的方法,因此不再需要弄乱反思。)

答案 2 :(得分:0)

我真的不明白这个问题 - 通常不需要向上转换 但它的问题就是获得对象的上层类 如果使用getSuperclass方法:

    Constructor<?> ctor = clazz.getDeclaredConstructor(iViewClass.getSuperclass());

文档:getSuperclass()