我想调用默认访问类Demo的主要方法:
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)
答案 0 :(得分: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
答案 1 :(得分: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);