Java 进阶反思

Java Advanced Reflection

所以我在包 com.one.

中有 class Foo
//package com.one
class Foo{
     protected static void a(){
         //...
     }
}

和 class Barcom. 两个 扩展 Foo

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

如果我在 com.two 里面,我可以使用反射让 a() 不受保护,然后调用它吗?

是的,你可以。只需抓住这个方法并使用 setAccessibletrue

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

这样的超类来实现
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.

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

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();
        }