如果我有以下Java代码:
package a.b.c;
public class A{
static class B{
public B(){
}
}
}
我想通过反射在运行时将类B的修饰符更改为"public",我该怎么做?谢谢。
效果如下:
package a.b.c;
public class A{
public static class B{
public B(){
}
}
}
使用反射,您不能更改类修饰符,但可以创建指定类的对象并调用其方法。
您可以使用getDeclaredClasses()
方法从封闭类中获得类的实例,然后修改构造函数并实例化对象:
Class a = A.class;
Class subs[] = a.getDeclaredClasses();
Object o = null;
for (Class cls: subs) {
if(cls.getCanonicalName().equals("A.B")){
for (Constructor ct: cls.getDeclaredConstructors()) {
ct.setAccessible(true);
o = ct.newInstance(new Inner());
// o is an instance of B
// you can get public and private method and invoke them
for (Method m: o.getClass().getDeclaredMethods())
if(m.getName().equals("....")){
m.setAccessible(true);
m.invoke(o, ....));
}
}
}
}
可以通过名称和参数列表获取方法,而不是for循环。