通过反射改变内部Java类修饰符为Public



如果我有以下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循环。

相关内容

  • 没有找到相关文章

最新更新