0

クラスローダーを使用して、Java のプライベート クラス内で静的メソッドを呼び出したいと考えています。

これは、私が使用しているクラスローダーの短いバージョンです。

URL[] jarURLArray = { server.lan.serverJAR().toURL() };
URLClassLoader serverClassLoader = new URLClassLoader(jarURLArray,  this.getClass().getClassLoader());
Class mainClass = Class.forName("com.packagename.someclass", true, serverClassLoader);
Class sampleArgClass[] = { (new String[1]).getClass() };
Method mainMethod = mainClass.getDeclaredMethod("getSimplifiedName", sampleArgClass);
Object mainMethodInstance = mainClass.newInstance();
Object serverArgConverted[] = { args };
Object result = mainMethod.invoke(mainMethodInstance, serverArgConverted);

このコードは jar ファイルからクラスをロードし、通常の状況でクラスを呼び出すことができます。

このようなクラスがある場合:

public final class someClass
{
private static Server server;

/**
 * Static class cannot be initialized.
 */
private someClass()
{
}

public static int someValue()
{
    return someValue;
}

クラスローダーがクラスの新しいインスタンスを作成する方法が原因で、 someValue() メソッドに到達できません。これは、プライベートコンストラクターがあるため不可能です。

クラスローダーを使用して someValue メソッドにアクセスするにはどうすればよいですか?

4

1 に答える 1

3

クラスローダーは新しいインスタンスを作成していません:ここで VM に新しいインスタンスを作成するように指示しています:

Object mainMethodInstance = mainClass.newInstance();

そうしないでください。null静的メソッド呼び出しのターゲットとして渡すだけです。

Object result = mainMethod.invoke(null, serverArgConverted);
于 2013-07-21T07:34:57.863 に答える