Java类加载器 - 在私有类中调用静态方法

时间:2013-07-21 07:33:13

标签: java classloader

我想使用类加载器在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方法?

1 个答案:

答案 0 :(得分:3)

类加载器没有创建新实例:你告诉 VM在这里创建一个新实例:

Object mainMethodInstance = mainClass.newInstance();

不要那样做。只需传入null作为静态方法调用的目标:

Object result = mainMethod.invoke(null, serverArgConverted);