我非常感觉答案在某个地方,但要么我缺乏正确的关键词,要么只是应该睡一觉,但这里是;〜):
我需要扩展BufferedImage,这是实现这一目标的唯一方法。不管MacGyvering整个类都是让新类放在java.awt.image中,因为它包含一个我只需要包的可见字段访问。 Normaly,有理由不做这样的事情,但是如果你查看来源,你会发现在这种特殊情况下这不是真的。
所以我测试了它,它编译并且似乎运行。
但我能依靠它吗?是允许的吗?有什么东西可以阻止我向java的预定义系统包添加类吗?或者这只是正确的方法而没有人告诉我?
更新
已经提供的回答表明存在法律问题的可能性(如果做某事正确意味着违反某些法律,而不是我的默认解决方案经常对这些法律不感兴趣;-)以及改变行为的可能性超级阶级(在这种情况下非常不可能)。如果就是这样,我就这样做......
UPDATE2
大! Java是一个受保护的软件包名称......所以我真的需要MacGyver这个......
UPDATE3
我只是想知道为什么我不能获得属性哈希键。 fn getPropertyNames记录如下:返回由getProperty(String)识别的名称数组 ...让我们看一下源代码:
public String[] getPropertyNames() {
return null;
}
我读过的最佳代码......
答案 0 :(得分:1)
好的,这就是我如何处理这个问题:
public class MyBi extends BufferedImage
{
private final BufferedImage realBufferedImage;
public MyBi(BufferedImage bi)
{
super(0, 0, TYPE_INT_ARGB);
realBufferedImage = bi;
}
// Add methods for managing your extra data
// For every method in BufferedImage, override it like so:
public void setData(Raster r)
{
realBufferedImage.setData(r);
}
}
手动执行这一过程非常繁琐,但NetBeans支持委派。
按 Alt 插入,选择Delegate Method...
,选择realBufferedImage
作为左侧面板中的字段,然后在右侧面板中选中BufferedImage
,点击OK
。即时授权。
这应该有效,因为尽管BufferedImage的字段在包范围内,但包中没有其他内容可以访问它们。
答案 1 :(得分:0)
您没有“添加”到java.awt.Image。在您自己的包中,您可以扩展课程并随意进行。
有时,在开源项目中,您可以将您的课程提交回项目并让它成为项目的一部分。