所以我在包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()
不受保护,然后调用它?
答案 0 :(得分:1)
是的,你可以。只需抓取此方法,并将setAccessible
与true
一起使用即可。
要获取此方法,您无法在子类中使用setDeclaredMethod
或getMethod
,因为它没有在那里声明或不公开。获得它的最简单方法是通过像
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();
}