如何在A类中运行方法foo()而不对此类进行任何更改
public final class A{
private A(){
System.exit(0);
}
public void foo(){
System.out.println("from foo");
}
}
答案 0 :(得分:1)
没有像使用反射或字节码操作那样搞乱可访问性......
执行此操作的“正确”方法是以其他方式获取类的实例。例如,如果存在静态工厂方法或可以访问的预制实例。拥有这样的私有构造函数的原因是控制类的构造。 (例如,枚举实现具有私有构造函数,因此除了提供的静态构造之外,您不会创建其他实例。)
如果你支持这一点,那么某人(无论是你或原作者)都做错了。
答案 1 :(得分:1)
您可以在不调用构造函数的情况下创建类的实例。请参阅此问题:Is it possible to create an instance of an object in Java without calling the constructor?
您可以使用objenesis为您执行此操作。在没有调用构造函数的情况下获得A
的实例后,调用foo
很容易。
答案 2 :(得分:0)
您可以在jvm加载之前更改字节代码。这是一个开始的地方: http://www.ibm.com/developerworks/java/library/j-dyn0916/index.html