Java高级反思

时间:2015-01-25 03:28:06

标签: java reflection

所以我在包Foo中有com.one课。

//package com.one
class Foo{
     protected static void a(){
         //...
     }
}
扩展Bar

的包com.two中的

和类Foo

//package com.two
class Bar extends Foo{
    //...
}

我是否可以使用反射,如果我在com.two内部,使a()不受保护,然后调用它?

2 个答案:

答案 0 :(得分:1)

是的,你可以。只需抓取此方法,并将setAccessibletrue一起使用即可。

要获取此方法,您无法在子类中使用setDeclaredMethodgetMethod,因为它没有在那里声明或不公开。获得它的最简单方法是通过像

这样的超类来实现
Method method = Foo.class.getDeclaredMethod("a");

Method method = Bar.class.getSuperclass().getDeclaredMethod("a");   
//                        ^^^^^^^^^^^^^ assuming that `a` is declared in superclass,
//                                      it is possible that you may want to use 
//                                      `getSuperclass` few more times

然后你可以打电话

method.setAccessible(true);

更改其可访问性并使用它

method.invoke(null);//static methods require no instance.

答案 1 :(得分:0)

是的,您应该可以使用反射。写下面的代码:

try {
            Method method = Foo.class.getDeclaredMethod("a");
            method.setAccessible(true);
            try {
                method.invoke(null);
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }