2017-07-01 5 views
-1

javaリフレクションライブラリで次の静的メソッドを呼び出そうとしています。Javaリフレクションライブラリで静的メソッドを呼び出す

import java.net.InetAddress; 
import java.net.UnknownHostException; 

public class ah 
{ 
    static void a() 
    { 
    try 
    { 
     Client.dU = 10; 
     Client.dV = 0; 
     Client.dX = true; 
     cp.d = 32; 
     cp.a(InetAddress.getLocalHost()); 
     Client.iq = Client.E(); 
     Client.ir = w.a(); 
     Client.is = 2019030189; 
    } 
    catch (UnknownHostException localUnknownHostException) {} 
    } 
} 

public void invokeInit() throws NoSuchMethodException, SecurityException, IllegalAccessException, 
      IllegalArgumentException, InvocationTargetException { 
     Class<?> initClass = loader.loadClass("ah"); 
     Method initMethod = initClass.getDeclaredMethod("a", null); 
     initMethod.invoke(null, new Object[] {}); 
    } 

を次のように私の現在のコードがあるそれは私に次のエラー

java.lang.IllegalAccessException: Class org.baiocchi.client.reflection.Game can not access a member of class ah with modifiers "static" 
    at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102) 
    at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:296) 
    at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:288) 
    at java.lang.reflect.Method.invoke(Method.java:491) 
    at org.baiocchi.client.reflection.Game.invokeInit(Game.java:28) 
    at org.baiocchi.client.reflection.Game.getApplet(Game.java:33) 
    at org.baiocchi.client.Engine.start(Engine.java:21) 
    at org.baiocchi.client.Booter.main(Booter.java:6) 

を与える任意の助けを事前にありがとうございます!

+0

あなたの 'invokeInit'はあなたの' ah'クラスと同じパッケージにありますか? –

+0

番号。 init()メソッドは別のプログラムで実行されています。私はinvokeInit()メソッドを使用して私のプログラムを通してそれを呼び出そうとしています。 @NeerajJain – Bautista

+0

@Bautista Neeraj Jainが提案したように、それらを同じパッケージに入れるか、メソッドaをパブリックメソッドに変更する – Gearon

答えて

2

にjava.lang.IllegalAccessException:クラス org.baiocchi.client.reflection.Gameは、あなたがしたい場合は

IllegalAccessException修飾子を持つクラス ああ、「静的」のメンバーがスローされアクセスできません。プライベートな方法や他の方法ではアクセスできないメソッド(通常はクラスのパッケージから呼び出さないで、package privateメソッド)を呼び出します。指定されたブール 値にこのオブジェクトのaccessibleフラグを設定

initMethod.setAccessible(true); 


あなたはこの制約を取り除くためにMethodオブジェクトにpublic void setAccessible(boolean flag)を呼び出すことができます。値がtrueの場合、反映されたオブジェクトは、 が使用されたときにJava言語アクセスチェックを抑制する必要があります。 という値の値は、反映されたオブジェクトがJava言語 のアクセス検査を実施する必要があることを示します。

+0

これはまた、悲しいことにエラーをスローします。 – Bautista

+0

しないでください。どちらのエラー? 'initMethod.setAccessible(true);'は、 'initMethod.invoke(null、new Object [] {});'の前に呼び出されるべきです。 ' – davidxxx

関連する問題