1

デフォルトのアクセスクラス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)
4

2 に答える 2

3

コードの主な問題は、クラスのインスタンスで静的メソッドを呼び出そうとしていることです。静的メソッドはオブジェクトではなくクラス全体に属しているため、代わりにインスタンスをメソッド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
于 2013-03-24T11:15:38.387 に答える
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);
于 2013-03-24T11:16:47.923 に答える