我需要用Java覆盖最终类的构造函数。我知道这并不理想,但不幸的是它是必需的。有没有什么聪明的解决方法能够实现这一目标?具体来说,有一个方法在最后一个类的构造函数中被调用,我需要用一个不同的参数调用它(现在用最终类的包中定义的常量调用它)。在Java final class中覆盖构造函数
-1
A
回答
1
没有好招规避最终方法,但there is a good trick against (static or not) final fields。如果改变你所提到不变的是一个选项,那么你可以做,通过使用反射:
private static void setDefault(String newDefault) throws Exception {
Field staticField = SomeFinalClass.class.getDeclaredField("CONSTANT");
setValue(null, staticField, newDefault);
}
protected static void setValue(Object owner, Field field, Object value) throws Exception {
makeModifiable(field);
field.set(owner, value);
}
/**
* Force the field to be modifiable and accessible.
*/
protected static void makeModifiable(Field nameField) throws Exception {
nameField.setAccessible(true);
int modifiers = nameField.getModifiers();
Field modifierField = nameField.getClass().getDeclaredField("modifiers");
modifiers = modifiers & ~Modifier.FINAL;
modifierField.setAccessible(true);
modifierField.setInt(nameField, modifiers);
}
}
注:显然这样的伎俩应轻拿轻放,避免如果有一个常规设计模式可用。
+0
谢谢,我会试试看看它是否有效:) – user16655
4
这不仅仅是不理想,也不可能,因为它是最终的。你最好的选择是创建一个包装类:
class WrapperClass {
private FinalClass finalClass;
public WrapperClass() {
finalClass = new FinalClass();
}
public void doStuff() {
finalClass.doStuff(); // <- this would be the final method you want to override
// Do your own stuff
}
}
0
如果你想修改类有一个接口,可以使用java.lang.reflect.Proxy
:
public class ProxyTest {
@Test
public void proxy() throws Throwable {
InvocationHandler handler = new MyInvocationHandler(new MyClass());
MyInterface f = (MyInterface) Proxy.newProxyInstance(MyClass.class.getClassLoader(),
new Class[] { MyInterface.class },
handler);
int result = f.test();
assertThat(result).isEqualTo(20);
}
}
class MyInvocationHandler implements InvocationHandler {
private MyInterface wrappedInstance;
public MyInvocationHandler(MyInterface object) {
this.wrappedInstance = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if(method.getName().equals("test")){
return 20;
} else {
return method.invoke(this.wrappedInstance, args);
}
}
}
相关问题
- 1. 覆盖构造函数类
- 2. 覆盖java中的子类中的参数化构造函数
- 3. 覆盖超类的构造函数
- 4. googletest移动构造函数覆盖
- 5. 父类构造函数的Powershell覆盖
- 6. 构造函数覆盖可能吗?
- 7. 构造函数未覆盖的分支
- 8. 构造覆盖
- 9. 覆盖Java的构造在斯卡拉
- 10. Java函数覆盖
- 11. 如何覆盖fortran中的结构构造函数
- 12. 复制构造函数去基础构造函数并覆盖复制值
- 13. 使用反射覆盖超类构造函数与基类构造函数
- 14. 如何在CakePHP中正确覆盖模型的构造函数
- 15. 无法解决匹配的构造函数 - 覆盖BaseRepository类
- 16. 在java中调用继承构造函数的构造函数
- 17. OOP - 覆盖init方法在构造函数
- 18. 覆盖默认构造
- 19. Java构造函数
- 20. 构造函数(java)
- 21. Java - 构造函数
- 22. IServiceCollection覆盖单个构造函数参数
- 23. scala:覆盖构造函数的隐式参数
- 24. 用参数构造函数实现的Java Inner-class direclty?
- 25. 和Inner Class的构造函数
- 26. 构造函数调用可覆盖方法(延迟调用)
- 27. 覆盖LinearLayout构造函数之一的奇怪问题
- 28. 构造函数。无法覆盖对全局变量的引用
- 29. 覆盖WCF DataMember的字典构造函数
- 30. Python - 基类的构造函数被覆盖
final类不能被覆盖,看'String'类。 – SamTebbs33