我可以在java中设置默认包吗?

时间:2014-08-12 06:09:35

标签: java

我们知道java.lang是java中的默认包,我们不需要从中导入任何内容。

  1. 是否还有其他任何套餐,例如java.lang
  2. 我可以使用java.lang添加其他默认包吗?
  3. 我可以用任何其他包替换java.lang(我的意思是,如果我     重写从java.lang到的所有类和接口     java.lang1,然后我可以将java.lang1设置为默认值吗?
  4. 我可以将基类(java.lang.Object)更改为其他类吗?
  5. 如果上面列出的东西是可能的,我应该在哪里编写代码? (这是java代码片段还是某种jvm或编译器特定的代码?)

3 个答案:

答案 0 :(得分:15)

我确信所有这些都不可能发布,“不,这些都不可能。”注意你不能用反射来做,因为这些都是编译时的问题。

(4),“我可以从Object更改默认基类”,与其他基类不同,并且是最荒谬的。这会在编译时打破许多程序,因为即使像System.out.println(user)这样的事情也依赖于对象user具有toString方法的事实。特别是String已被破坏,因为其toString方法是从Object继承的。

你问的其他所有内容都只是编译时间,所以不那么荒谬,但仍然不可能。

为了完整性,这也是一种奇怪和不好的做法。我听说过一个C程序员,他将#define retrun return包含在头文件中。因此,当任何其他开发人员维护他的代码时retrun eta;,他们必须挖掘头文件以了解其含义。这是写优化代码,但软件工程是关于读优化代码(是的,我正在推广;试图在段落中覆盖这一点)。杂乱的进口就是这样做的 - 它告诉事情来自哪里非常模糊,这对StringException来说很好,但即使java.util中的事情也有问题。是的,这条线在某些时候是任意的,但我觉得它很聪明,当然不应该包含更多的东西。

答案 1 :(得分:0)

您无法在java中更改java.lang的默认包。必须使用import语句导入除此包之外的所有类。所以对于你的1,2 and 3答案是否定的。

Can I change the base class (java.lang.Object) to some other class ? 答案是没有了(至少不是一个简单的方法,没有搞乱bootclasspath和东西),为什么你想这样做。如果需要,您可以改为说YourClass extends Object并实现额外的功能并覆盖现有的功能。但即使这样,所有类也不会像Object那样从你的类中隐式扩展。使用Object类的推荐方法是覆盖其方法以实现特定于您的类的自己的功能(如覆盖toString())。

答案 2 :(得分:0)

是的,你可以。但这种情况非常罕见。

从理论上讲,你可以在运行时轻松地做到这一点。使用Java Agent API替换(换行)默认Object类的字节码。对于需要自定义功能的所有类加载器也要这样做。

注意:

  1. Java Agent API可能会花费您大约10%的运行时性能。
  2. JVM / JRE通常经过认证,符合规范。这意味着,当您修改/替换JVM分发中的默认类时,可能loose support and/or your license to use the JRE (see "Xbootclasspath")。您应该验证在您的个案中是否允许这种类型的JRE类修改。
  3. 这真的不复杂。它只是另一种API。