我想向一个已经存在的类中添加一些方法。我可以使用该类的源代码(只读)。
挑战在于这些新方法依赖于已经存在的类的私有字段,因此继承不是一种选择。
在我看来,我有两个不太有利的选择来实现我的目标。一种选择是将所有源代码复制到一个新的类中,并在那里添加我的新方法。另一种选择是使用Reflection。这两种方法都不理想,第一种是用大锤敲螺母。第二,因为它违背了面向对象封装的主要思想.
问题是:还有其他方法来实现我的目标吗?还是我只能选择这些选择?
发布于 2022-07-12 21:38:58
这个班不够灵活。这是其代码的一个缺陷。因此,用另一个名称重新实现类,并在javadoc中描述所有这些。然后添加您的功能,可能是继承。
的确,这是一个丑陋的情况,与坏的和好的阶级生活。也许您甚至需要应用适配器模式,将一个好的类实例(您的副本)更改回一个坏的类(原始的)。
您可以记录一个技术债务,用该私有字段替换实现。
应该提到的是,如果使用公共获取器,则可以劫持私有字段并使用第二个字段。如果不是你会看到的。造成复杂的语义学。
发布于 2022-07-12 20:57:41
在java中,这是不可能的。
你应该看看Lombok项目,我相信它有类似于你正在寻找的东西。
如果您不想使用外部库,反射将是您最好的选择。下面是两个可以帮助您入门的实用方法:
public static boolean setField(Object target, String fieldName, Object value) {
try {
var f = target.getClass().getDeclaredField(fieldName);
f.setAccessible(true);
f.set(target, value);
return true;
} catch(IllegalAccessException | NoSuchFieldException e) {
return false;
}
}
public static Object getField(Object target, String fieldName) {
try {
var f = target.getClass().getDeclaredField(fieldName);
f.setAccessible(true);
return f.get(target);
} catch(IllegalAccessException | NoSuchFieldException e) {
return null;
}
}https://stackoverflow.com/questions/72958155
复制相似问题