首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向现有类添加功能(使用私有字段)

向现有类添加功能(使用私有字段)
EN

Stack Overflow用户
提问于 2022-07-12 20:42:38
回答 2查看 102关注 0票数 0

我想向一个已经存在的类中添加一些方法。我可以使用该类的源代码(只读)。

挑战在于这些新方法依赖于已经存在的类的私有字段,因此继承不是一种选择。

在我看来,我有两个不太有利的选择来实现我的目标。一种选择是将所有源代码复制到一个新的类中,并在那里添加我的新方法。另一种选择是使用Reflection。这两种方法都不理想,第一种是用大锤敲螺母。第二,因为它违背了面向对象封装的主要思想.

问题是:还有其他方法来实现我的目标吗?还是我只能选择这些选择?

EN

回答 2

Stack Overflow用户

发布于 2022-07-12 21:38:58

这个班不够灵活。这是其代码的一个缺陷。因此,用另一个名称重新实现类,并在javadoc中描述所有这些。然后添加您的功能,可能是继承。

的确,这是一个丑陋的情况,与坏的和好的阶级生活。也许您甚至需要应用适配器模式,将一个好的类实例(您的副本)更改回一个坏的类(原始的)。

您可以记录一个技术债务,用该私有字段替换实现。

应该提到的是,如果使用公共获取器,则可以劫持私有字段并使用第二个字段。如果不是你会看到的。造成复杂的语义学。

票数 1
EN

Stack Overflow用户

发布于 2022-07-12 20:57:41

在java中,这是不可能的。

你应该看看Lombok项目,我相信它有类似于你正在寻找的东西

如果您不想使用外部库,反射将是您最好的选择。下面是两个可以帮助您入门的实用方法:

代码语言:javascript
复制
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;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72958155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档