是否可以通过反射调用无修饰符类或默认类



我想调用默认访问类Demo的main方法:

class Demo {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

从另一个类中调用,比如:

    String[] str = {};
    Class cls = Class.forName(packClassName);        
    Method thisMethod = cls.getMethod("main", String[].class);        
    thisMethod.setAccessible(true);        
    thisMethod.invoke(cls.newInstance(), (Object) str);

但是我得到例外,即

java.lang.IllegalAccessException: Class javaedit.Editor can not access a member of class Demo with modifiers ""
        at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:95)
        at java.lang.Class.newInstance0(Class.java:366)

你的代码的主要问题是,你试图调用类的实例上的静态方法。静态方法不属于对象,而是属于整个类,所以实例使用null作为invoke方法的第一个参数

String[] str = {};
Class cls = Class.forName(packClassName);        
Method thisMethod = cls.getMethod("main", String[].class);        
thisMethod.setAccessible(true);        
thisMethod.invoke(null, new Object[]{str});//ver 1
thisMethod.invoke(null, (Object)str);//ver 2

如果你知道类的全名,这可以用反射来完成,例如给定一个包私有类:

class AcessCheck {
    public static final void printStuff() {
        System.out.println("Stuff");
    }
}

你可以调用printStuff方法与反射使用如下:

    final Class<?> c = Thread.currentThread().getContextClassLoader().loadClass("com.mypackage.AcessCheck");
    final Method m = c.getDeclaredMethod("printStuff", (Class[]) null);
    m.setAccessible(true);
    m.invoke(null, (Object[]) null);

相关内容

  • 没有找到相关文章

最新更新