2011-11-23 77 views
1

是否有可能在保留原始名称的同时在java中扩展类?如果现在我可以添加到该类的额外功能(注意这个类是由android sdk提供的,它的视图类)扩展类,同时保留在java中的名称

+0

这是不可能的,但也许如果你可以描述你想要在更高的层次上做什么,那么有人可以建议一个替代方法来完成你想要完成的任务。 – goto10

+0

@ goto10例如我想添加一个函数到View类的android,但我不想扩展它,并使用新的类名。 –

+0

我很了解。但是,你能用更一般的术语来描述你的目标吗? “我希望所有的观点都是紫色的。” “我希望所有的视图弹出一个消息框,当我点击它们时,会显示'嗨'。”你想要的具体技术解决方案是不可能的,但可能有另一种方法来实现你的目标。 – goto10

回答

4

不,Java中的类不是“可重新打开的”。扩展是一个新类。

(一个警告,通过背叛你也许可以添加字节码,但没有将能够在编译时访问它。)

+0

同意。 Java中没有类似于Objective-C“类别”的东西。 –

+0

在Android上添加字节码是不可能的 –

+0

@MikeG [This](http://groups.google.com/group/android-platform/browse_thread/thread/21549d6f3228eb50?pli=1)似乎不同意。无论哪种方式,它取决于何时以及如何添加它。就像我所说 - 无论如何不会在编译时提供。 –

0

当你扩展中的Java类,您可以通过创建这样做一个新名字的新班级。 ex:

public class MySpecialView extends View 

扩展类未被修改。

3

只有当它位于不同的包中时,才可以这样做。 (也就是说,它可以有相同的简单的名字,但不是同一个合格的名称。)

package com.me; 

class Number extends java.lang.Number { 
    // ... 
} 
+0

谢谢你。刚花了一个小时解决了一个完全无关的问题,这个答案让我走上了正确的轨道。 – velis

0

我假定你的意思是完全合格的名称(FQN =包+类名)。所以,不,你不能,而你真的不应该。这就是首先要有一个包名称。

但是,如果您坚持这样做,您可以使用相同的包和相同的名称创建一个新的类,从原始源代码开始(假设您拥有它)并更改您需要的任何功能。根据类路径顺序(通常您的源代码优先于任何包含的库,但您必须确保它是如此),类加载器将选择您的类而不是原来的类。但这更像是一种黑客行为,我强烈建议避免它,除非您确切知道自己在做什么,因为您可能会遇到各种意想不到的行为。