Java 进阶反思
Java Advanced Reflection
所以我在包 com.one
.
中有 class Foo
//package com.one
class Foo{
protected static void a(){
//...
}
}
和 class Bar
包 com. 两个
扩展 Foo
//package com.two
class Bar extends Foo{
//...
}
如果我在 com.two 里面,我可以使用反射让 a()
不受保护,然后调用它吗?
是的,你可以。只需抓住这个方法并使用 setAccessible
和 true
。
要获取此方法,您不能使用子类中的 setDeclaredMethod
或 getMethod
,因为它没有在那里声明或不是 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();
}
所以我在包 com.one
.
Foo
//package com.one
class Foo{
protected static void a(){
//...
}
}
和 class Bar
包 com. 两个
扩展 Foo
//package com.two
class Bar extends Foo{
//...
}
如果我在 com.two 里面,我可以使用反射让 a()
不受保护,然后调用它吗?
是的,你可以。只需抓住这个方法并使用 setAccessible
和 true
。
要获取此方法,您不能使用子类中的 setDeclaredMethod
或 getMethod
,因为它没有在那里声明或不是 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();
}