Можно ли установить пакет по умолчанию в java?

Мы знаем, что java.lang - это пакет по умолчанию в java, и нам не нужно ничего им импортировать.

  • Есть ли другой пакет (ы), например java.lang?
  • Можно ли добавить еще один пакет по умолчанию с java.lang?
  • Можно ли заменить java.lang на любой другой пакет (я имею в виду, если я   перезаписать все классы и интерфейсы от java.lang до   java.lang1, тогда я могу установить java.lang1 по умолчанию)?
  • Можно ли изменить базовый класс (java.lang.Object) на какой-то другой класс?
  • Если перечисленные выше вещи возможны, где я должен писать код для этого? (Это будет фрагмент кода java или какой-либо jvm или код для компилятора?)

Ответ 1

Я уверен, что все это невозможно просто опубликовать, "нет, это невозможно". Обратите внимание, что вы не можете сделать это с отражением, поскольку все это вопросы времени компиляции.

(4), "я могу изменить базовый класс по умолчанию из Object", не похож на другие, и является самым смехотворным. Это сбило бы много многих программ при компиляции, потому что даже выполнение чего-то вроде System.out.println(user) основывается на том, что объект user имеет метод toString. В частности, String нарушается, потому что его метод toString наследуется от Object.

Все остальное, что вы просили, - это только время компиляции, поэтому менее смехотворно, но все же невозможно.

Для полноты, это также было бы странной и плохой практикой. Я слышал о программисте C, который включил #define retrun return в файл заголовков. Поэтому, когда любой другой разработчик, поддерживающий его код, видел retrun eta;, им пришлось выкапывать файл заголовков, чтобы знать, что это значит. Это код, оптимизированный для записи, но разработка программного обеспечения - это код для оптимизации чтения (да, я обобщаю, пытаясь охватить это в абзаце). Загрязненный импорт делает это - он очень неясен, чтобы сказать, откуда взялись вещи, что отлично подходит для String и Exception, но проблематично даже для вещей в java.util. Да, в какой-то момент эта линия была произвольной, но я считаю ее разумной и, конечно же, не должен включать больше вещей.

Ответ 2

Вы не можете изменить свой пакет по умолчанию в 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()).

Ответ 3

Да, вы можете. Но это очень необычно.

Теоретически вы можете сделать это легко, во время выполнения. Используйте API Java Agent, чтобы заменить (обернуть) байтовый код класса Object по умолчанию. И сделайте то же самое для всех классов-загрузчиков, где вам нужны ваши пользовательские функции.

Примечание:

  • API агента Java может стоить вам около 10% производительности во время выполнения.
  • JVM/JRE обычно сертифицирована для соответствия спецификации. Значение, когда вы изменяете/заменяете класс по умолчанию в своем JVM-дистрибутиве, вы можете потерять поддержку и/или свою лицензию на использование JRE (см. "Xbootclasspath" ). Вы должны убедиться, что этот тип модификации класса JRE разрешен в вашем индивидуальном случае.

Это действительно не сложно. это просто еще один API.