如果我有以下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(){
}
}
}
答案 0 :(得分:0)
通过反射,您无法更改类修饰符,但您可以创建指定类的对象并调用其方法。
您可以使用方法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 循环。