Как создать class файл

Обновлено: 03.07.2024

Как подключить свой класс?
Есть основной файл с тремя кнопками который выполняет функции при нажатии. Эти функции описаны в.

Как к проекту подключить свой класс
Здравствуйте. Объясните мне не учёному, как в Windows Forms к проекту подключить свой класс. Уже.

как создать свой класс, в Делфи?
как создать свой класс, в Делфи? а потом вызвать, например при открытии? begin if.

andrue_selen, Если не секрет, какую литературу используете? Обычно в книгах для начинающих классы даются после прохождения базисных тем, в которых идёт толкование тех самых Если вам так интересно, то вот реализация простейшего класса:
Файл Source.cpp
Нет такого. Есть данные-члены (data members), которые некоторые называют также "полями класса" (class fields).

Нет такого. Есть функции-члены (function members), которые некоторые называют также "методами класса" (class methods).

Соответственно, в зависимости от доступа, члены класса могут быть закрытыми (private members) или открытыми (public members).

закрытыми (private members) или открытыми (public members). Нет такого. Есть данные-члены (data members), которые некоторые называют также "полями класса" (class fields). Нет такого. Есть функции-члены (function members), которые некоторые называют также "методами класса" (class methods). Тут я имел ввиду, функции, позволяющие работать с полями.

P.S. По поводу терминологии обещаю подтянуться

Дейтел,программирование на С++.Там есть небольшое введение в классы в главе 3 Вот еще рабочий пример, корявый, но рабочий в VS2008
исполняемый matrik.h
andrue_selen, Файл-то подключить получилось или все еще не выходит?

Добавлено через 3 минуты
Bespridelschic, Конечно интересно,спасибо,начинаю въезжать))

нету такого в стандрате) слово fields пошло от "неверных" сишарперов).

И такого на 56% уверен, что нету. Так как class methods отвечает за это понятие) И следовательно можно сказать
class methods == function members , в чём я собственно не уверен)))

Добавлено через 1 минуту

<> ищёт у себя в библиотеках (я про С++ компилятор)
"" ищет в папке(-ах) отмеченых как "Includes Directories"

Добавлено через 2 минуты

56% не спроста - из-за толкования равенства двух выражений как одно и тоже. Я за 56% что это не одно и тоже. Написал же ж. Почему не читаем? *грустный_смайлик* нету такого в стандрате) слово fields пошло от "неверных" сишарперов). Thus, the valarray template is neither a matrix class nor a field class напоминает игру "найди самое редкое слово в стандарте" )

Ну, справедливости ради, я, короче, искал, искал что это за поле-то такое, но так и не нашел.
англ. не очень..
просто оно там, такое понятие, встречается.

rikimaru2013, в C++ общепринятые термины данные-члены (data members) и функции-члены (function members) - оба термина имеются и в стандарте и в книгах Страуструпа.

Узнайте, как использовать javac для создания файлов *.class.

1. Обзор

В этом руководстве будет представлен инструмент javac и описано, как использовать его для компиляции исходных файлов Java в файлы классов.

Мы начнем с краткого описания команды javac , а затем рассмотрим инструмент более подробно, рассмотрев его различные варианты.

2. Команда javac

Мы можем указать параметры и исходные файлы при выполнении инструмента javac :

Где [параметры] обозначает параметры, управляющие операциями инструмента, и [исходные файлы] указывает один или несколько исходных файлов, которые будут скомпилированы.

Все варианты действительно совершенно необязательны. Исходные файлы могут быть непосредственно указаны в качестве аргументов команды javac или сохранены в файле аргументов, на который ссылается ссылка, как описано ниже. Обратите внимание, что исходные файлы должны быть расположены в иерархии каталогов, соответствующей полным именам типов, которые они содержат .

Параметры javac подразделяются на три группы: стандартные, кросс-компиляционные и дополнительные. В этой статье мы сосредоточимся на стандартных и дополнительных опциях.

Параметры кросс-компиляции используются для менее распространенного случая компиляции определений типов в реализации JVM, отличной от среды компилятора, и не будут рассматриваться.

3. Определение типа

Давайте начнем с представления класса, который мы собираемся использовать для демонстрации опций javac :

Исходный код помещается в файл com/baeldung/javac/Data.java .

4. Стандартные опции

Одним из наиболее часто используемых стандартных параметров команды javac является -d , указывающий каталог назначения для сгенерированных файлов классов . Если тип не является частью пакета по умолчанию, создается структура каталогов, отражающая имя пакета, чтобы сохранить файл класса этого типа.

Давайте выполним следующую команду в каталоге, содержащем структуру, представленную в предыдущем разделе:

Компилятор javac сгенерирует файл класса javac-target/com/baeldung/javac/Data.class . Обратите внимание, что в некоторых системах javac не создает автоматически целевой каталог, который в данном случае является javac-target . Поэтому, возможно, нам придется сделать это вручную.

Вот несколько других часто используемых вариантов:

  • -cp(или-classpath,–class-path) – указывает, где можно найти типы, необходимые для компиляции наших исходных файлов. Если этот параметр отсутствует, а переменная среды CLASSPATH не задана, вместо этого используется текущий рабочий каталог (как это было в приведенном выше примере).
  • -p(или–путь к модулю) – указывает расположение необходимых прикладных модулей. Эта опция применима только к Java 9 и выше – пожалуйста, обратитесь к этому учебнику для руководства по системе модулей Java 9.

Если мы хотим знать, что происходит в процессе компиляции, например, какие классы загружаются и какие компилируются, мы можем применить параметр -verbose .

Предположим, что у нас есть два файла с именами options и types в каталоге javac-args со следующим содержимым:

Вместо того, чтобы хранить аргументы в отдельных файлах, мы также можем хранить их все в одном файле .

Предположим, что в каталоге javac-args есть файл с именем arguments :

Давайте передадим этот файл в javac , чтобы получить тот же результат, что и с двумя отдельными файлами до :

Обратите внимание, что варианты, которые мы рассмотрели в этом разделе, являются наиболее распространенными. Для получения полного списка стандартных javac опций ознакомьтесь с этой ссылкой .

5. Дополнительные опции

Дополнительные параметры javac -это нестандартные параметры, которые специфичны для текущей реализации компилятора и могут быть изменены в будущем. Поэтому мы не будем подробно рассматривать эти варианты.

Однако есть вариант, который очень полезен и заслуживает упоминания, -Xlint . Для получения полного описания других javac дополнительных опций перейдите по этой ссылке .

Опция -Xlint позволяет нам включать предупреждения во время компиляции . Существует два способа указать этот параметр в командной строке:

  • -Xlint – запускает все рекомендуемые предупреждения
  • -Xlint:клавиша[,клавиша]* – включает определенные предупреждения

Вот некоторые из самых удобных -Xlint клавиш:

  • rawtypes – предупреждает об использовании необработанных типов
  • unchecked – предупреждает о непроверенных операциях
  • static – предупреждает о доступе к статическому члену от члена экземпляра
  • cast – предупреждает о ненужных бросках
  • serial – предупреждает о том, что сериализуемые классы не имеют serialVersionUID
  • fallthrough – предупреждает о провале в операторе switch

Теперь создайте файл с именем xl в tops в каталоге javac-args со следующим содержимым:

При выполнении этой команды:

мы должны увидеть rawtypes и непроверенные предупреждения:

6. Заключение

В этом учебном пособии описан инструмент javac , показывающий, как использовать параметры для управления типичным процессом компиляции.

На самом деле мы обычно компилируем программу с помощью IDE или инструмента сборки, а не напрямую полагаемся на javac . Однако глубокое понимание этого инструмента позволит нам настроить компиляцию в расширенных случаях использования.

При компиляции класса Java создается файл класса с тем же именем. Однако, в случае вложенных классов или вложенных интерфейсов, он создает файл класса с именем, сочетающий внутренние и внешние имена классов, включая знак доллара.

В этой статье мы увидим все эти сценарии.

2. Подробная информация

В Java мы можем написать класс в классе. Класс, написанный внутри, называется вложенным классом, а класс, в который находится вложенный класс, называется внешним классом. Область вложенного класса ограничена областью его прилагаемого класса.

Аналогичным образом, мы можем объявить интерфейс в другом интерфейсе или классе. Такой интерфейс называется вложенным интерфейсом.

Мы можем использовать вложенные классы и интерфейсы для логически групповых сущностей, которые используются только в одном месте. Это не только делает наш код более читаемым и управляемым, но и увеличивает инкапсуляцию.

В следующих разделах мы подробно обсудим каждый из них. Мы также посмотрим на enums.

3. Вложенные классы

Вложенный класс является классом, который объявляется внутри другого класса или интерфейса. Каждый раз, когда нам нужен отдельный класс, но все же мы хотим, чтобы класс вел себя как часть другого класса, вложенный класс является лучшим способом его достижения.

Когда мы компилировать файл Java, он создает .class файл для класса ограждения и отдельные файлы классов для всех вложенных классов. Сгенерированный файл класса для класса ограждения будет иметь то же имя, что и класс Java.

Прежде всего, давайте создадим простой класс Java:

3.1. Статические вложенные классы

Как следует из названия, вложенные классы, которые объявлены статические называются статическими вложенными классами. В Java разрешается использовать только вложенные статический.

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

Давайте объявим статический вложенный класс в нашем Внешние класс:

Когда мы компилировать наши Внешние класс , компилятор создает два файла класса, один для Внешние и еще один для СтатическаяНеупойс :

3.2. Нестатическое гнездование классов

Внешний класс может иметь только общедоступный или по умолчанию доступ, в то время как внутренний класс может быть частным, общедоступный, защищенный или с доступом по умолчанию. Тем не менее, они не могут содержать статических элементов. Кроме того, нам нужно создать экземпляр внешнего класса, чтобы получить доступ к внутреннему классу.

Давайте добавим еще один вложенный класс в наш Внешние класс:

Он генерирует еще один файл класса:

3.3. Местные классы

Локальные классы, также называемые внутренними классами, определяются в блоке – группе утверждений между сбалансированными скобками. Например, они могут быть в методе тела, для петля, или если статья. Область действия локального класса ограничена внутри блока так же, как и локальные переменные. Локальные классы при составлении отображаются как знак доллара с автоматически генерируемым номером.

Файл класса, генерируемый для локального класса, использует конвенцию именования — OuterClassName$1LocalClassName.class

Давайте объявим локальный класс в методе:

Компилятор создает отдельный класс файла для нашей Местные класс:

Аналогичным образом, мы можем объявить местный класс в если статья:

Несмотря на то, что мы создаем другой локальный класс с тем же названием, компилятор не жалуется. Он создает еще один класс файла и называет его с числом увеличилось:

3.4. Анонимные внутренние классы

Как следует из названия, анонимные классы являются внутренними классами без имени. Компилятор использует автоматически генерируемый номер после знака доллара, чтобы назвать файл класса.

Мы должны объявить и мгновенно анонимных классов в одном выражении в то же время. Они обычно расширяют существующий класс или реализуют интерфейс.

Рассмотрим быстрый пример:

Здесь мы создали анонимный класс, расширяя Внешние класс, и компилятор добавил еще один файл класса:

Аналогичным образом, мы можем реализовать интерфейс с анонимным классом.

Здесь мы создаем интерфейс:

Теперь давайте создадим анонимный класс:

Рассмотрим пересмотренный список файлов классов:

Как мы видим, файл класса генерируется для интерфейса HelloWorld и еще один для анонимного класса с именем Внешни$ $2 .

3.5. Внутренний класс в интерфейсе

Мы видели класс внутри другого класса, далее, мы можем объявить класс в интерфейсе. Если функциональность класса тесно связана с функциональностью интерфейса, мы можем объявить ее внутри интерфейса. Мы можем пойти на этот внутренний класс, когда мы хотим написать реализацию по умолчанию для методов интерфейса.

Давайте объявим внутренний класс внутри нашего HelloWorld интерфейс:

И компилятор генерирует еще один файл класса:

4. Вложенные интерфейсы

Вложенные интерфейсы, также известные как внутренние интерфейсы, объявлены внутри класса или другого интерфейса. Основная цель использования вложенных интерфейсов заключается в разрешении пространства имен путем группировки связанных интерфейсов.

Давайте посмотрим, как создать вложенные интерфейсы.

4.1. Интерфейс внутри интерфейса

Интерфейс, заявленный внутри интерфейса, неявно общедоступен.

Давайте объявим наш интерфейс внутри HelloWorld интерфейс:

Это позволит создать новый класс файла под названием HelloWorld$HelloSomeone для вложенного интерфейса.

4.2. Интерфейс внутри класса

Интерфейсы, заявленные внутри класса, могут принимать любой модификатор доступа.

Давайте объявим интерфейс внутри нашей Внешние класс:

Он будет генерировать новый файл класса с именем: Внешнийкласс$СтатическийКласс

5. Энумы

enum был введен в Java 5. Это тип данных, который содержит фиксированный набор констант, и эти константы являются примерами этого enum .

enum декларация определяет класс называется e num типа (также известного как перечисленный тип данных). Мы можем добавить много вещей к enum как конструктор, методы, переменные, и то, что называется постоянным конкретным телом класса.

Когда мы создаем enum , мы создаем новый класс, и мы неявно расширения Энум класса. Энум не может унаследовать любой другой класс или не может быть продлен. Тем не менее, он может реализовать интерфейс.

Мы можем объявить enum как отдельный класс, в его собственном файле источника или другой член класса. Давайте посмотрим все способы создания enum .

5.1. Энум как класс

Во-первых, давайте создадим простую enum :

Когда он будет составлен, компилятор создаст файл класса с именем Уровень для нашего enum.

5.2. Энум в классе

Теперь давайте объявим вложенный enum в нашем Внешние класс:

Компилятор создаст отдельный классный файл под названием Внешни$ цвет для нашего вложенного enum.

5.3. Enum в интерфейсе

Аналогичным образом, мы можем объявить enum в интерфейсе:

Когда HelloWorld интерфейс компилятора добавит еще один классный файл под названием HelloWorld$Прямой.

5.4. Энум в пределах enum

Мы можем объявить enum внутри другого enum :

Наконец, давайте посмотрим на генерируемые файлы класса:

Компилятор создает отдельный файл класса для каждого из enum Типы.

6. Заключение

В этой статье мы увидели различные конвенции именования, используемые для файлов класса Java. Мы добавили классы, интерфейсы и enums внутри одного файла Java и наблюдали, как компилятор создает отдельный файл класса для каждого из них.

Обычно удобно объединять множество файлов классов Java в один архивный файл.

В этом уроке мы рассмотрим все тонкости работы с jar – или J ava AR chive – файлами на Java.

В частности, мы возьмем простое приложение и рассмотрим различные способы его упаковки и запуска в виде jar. Мы также ответим на некоторые любопытные вопросы, такие как как легко прочитать файл манифеста jar по пути.

2. Настройка программы Java

Прежде чем мы сможем создать запускаемый jar-файл, наше приложение должно иметь класс с основным методом . Этот класс обеспечивает нашу точку входа в приложение:

3. Команда Jar

Теперь, когда мы все настроили, давайте скомпилируем наш код и создадим наш jar-файл.

Мы можем сделать это с помощью javac из командной строки:

Команда javac создает JarExample.class в каталоге com/baeldung/jar . Теперь мы можем упаковать это в файл jar.

3.1. Использование параметров по умолчанию

Чтобы создать файл jar, мы будем использовать кувшин команда.

Чтобы использовать команду jar для создания файла jar, нам нужно использовать опцию c , чтобы указать, что мы создаем файл, и опцию f , чтобы указать файл:

3.2. Установка основного класса

Полезно, чтобы манифест файла jar включал основной класс.

Манифест-это специальный файл в банке, расположенный в каталоге META-INF и названный MANIFEST.MF . Файл манифеста содержит специальную метаинформацию о файлах в файле jar.

Некоторые примеры того, для чего мы можем использовать файл манифеста, включают установку точки входа, установку информации о версии и настройку пути к классу.

Используя опцию e , мы можем указать нашу точку входа, и команда jar добавит ее в сгенерированный файл манифеста.

Давайте запустим jar с указанной точкой входа:

3.3. Обновление содержания

Допустим, мы внесли изменения в один из наших классов и перекомпилировали его. Теперь нам нужно обновить наш jar-файл.

Давайте используем команду jar с параметром u для обновления ее содержимого:

3.4. Настройка файла манифеста

В некоторых случаях нам может потребоваться больше контроля над тем, что входит в наш файл манифеста. Команда jar предоставляет функциональные возможности для предоставления нашей собственной информации о манифесте.

Давайте добавим частичный файл манифеста с именем example_manifest.txt чтобы ваше приложение установило нашу точку входа:

Информация о манифесте, которую мы предоставляем, будет добавлена к тому, что генерирует команда jar, так что это единственная строка, которая нам нужна в файле.

Важно, чтобы мы заканчивали наш файл манифеста символом |/newline . Без новой строки наш файл манифеста будет молча проигнорирован.

С этой настройкой давайте снова создадим нашу банку, используя нашу информацию о манифесте и опцию m :

3.5. Подробный Вывод

Если нам нужна дополнительная информация из команды jar , мы можем просто добавить опцию v для verbose.

Давайте запустим нашу команду jar с параметром v :

4. Использование Maven

4.1. Конфигурация по Умолчанию

Мы также можем использовать Maven для создания нашей банки. Поскольку Maven предпочитает условность конфигурации, мы можем просто запустить пакет для создания нашего jar-файла.

По умолчанию наш jar-файл будет добавлен в папку target в нашем проекте.

4.2. Указание основного класса

Мы также можем настроить Maven для указания основного класса и создания исполняемого jar-файла .

5. Использование Пружинного Ботинка

5.1. Использование Maven и Defaults

Если мы используем Spring Boot с Maven, мы должны сначала подтвердить, что наш параметр упаковки установлен в jar , а не war в нашем pom.xml файл.

Как только мы узнаем, что это настроено, мы можем запустить пакет цель:

5.2. Установка точки входа

Установка нашего основного класса-это то, где мы находим различия между созданием jar с обычным Java-приложением и fat jar для приложения Spring Boot . В приложении Spring Boot основной класс на самом деле является org.springframework.boot.loader.Ярлаунчер .

Хотя наш пример не является приложением Spring Boot, мы могли бы легко настроить его как консольное приложение Spring Boot .

Наш основной класс должен быть указан как начальный класс:

Мы также можем использовать Gradle для создания Spring Boot fat jar .

6. Запуск банки

6.1. Вывод основного класса

Поскольку мы пошли дальше и убедились, что наш основной класс указан в манифесте, мы можем использовать опцию -jar команды java для запуска нашего приложения без указания основного класса:

6.2. Указание основного класса

Мы также можем указать основной класс, когда мы запускаем наше приложение. Мы можем использовать опцию -cp , чтобы убедиться, что наш jar-файл находится в пути к классу, а затем предоставить ваш основной класс в формате package.className :

Использование разделителей путей вместо формата пакета также работает:

6.3. Перечисление содержимого банки

Мы можем использовать команду jar для перечисления содержимого нашего файла jar:

6.4. Просмотр файла манифеста

Поскольку может быть важно знать, что находится в нашем файле MANIFEST.MF , давайте рассмотрим быстрый и простой способ заглянуть в содержимое, не выходя из командной строки.

Давайте воспользуемся командой unzip с параметром-p:

7. Заключение

В этом уроке мы настроим простое Java-приложение с классом main .

Затем мы рассмотрели три способа создания jar-файлов: с помощью команды jar , с помощью Maven и с помощью приложения Maven Spring Boot.

После того, как мы создали наши jar-файлы, мы вернулись в командную строку и запустили их с выведенным и заданным основным классом.

Мы также узнали, как отображать содержимое файла и как отображать содержимое одного файла в банке.

Это обычный исполняемый файл программы или библиотеки, предназначенной для выполнения на виртуальной машине Java. Очевидно, вы открыли его редактором, который отображает содержимое нетекстовых файлов в шестнадцатиричном представлении.

Шестнадцатиричная последовательность 0xCAFEBABE - сигнатура заголовка .class-файла согласно стандарта.

33.7k 15 15 золотых знаков 61 61 серебряный знак 91 91 бронзовый знак

То что вы обнаружили, называется байткодом. Это набор инструкций, который является промежуточным между исходным кодом и машинным кодом. В дальнейшем он либо интерпретируется, либо компилируется jit компилятором в машинный.

Как известно, java кроссплатформенный язык. Из за этого исходный код компилировать в машинный сразу под все платформы крайне затруднительно. Поэтому, придумали байткод. Он не привязан к конкретной архитектуре, но при этом разбирает исходный код на мелкие инструкции, позволяющие производить некоторые оптимизации.

Формат данного файла описан в спеке.

Для дизассемблирования байткода можно воспользоваться стандартной утилитой javap

35.6k 2 2 золотых знака 53 53 серебряных знака 78 78 бронзовых знаков


14.6k 1 1 золотой знак 20 20 серебряных знаков 39 39 бронзовых знаков

0xcafebabe точнее CA FE BA BE - это стандартная сигнатура .class файла Java - об этом уже все сказали.

Имеется немало легенд почему выбрана такая сигнатура cafebabe - кафешная красотка, по словам Джеймса Гослинга (для тех кто в танке - создателя языка Java):

"We used to go to lunch at a place called St Michael's Alley. According to local legend, in the deep dark past, the Grateful Dead used to perform there before they made it big. It was a pretty funky place that was definitely a Grateful Dead Kinda Place. When Jerry died, they even put up a little Buddhist-esque shrine. When we used to go there, we referred to the place as Cafe Dead. Somewhere along the line it was noticed that this was a HEX number. I was re-vamping some file format code and needed a couple of magic numbers: one for the persistent object file, and one for classes. I used CAFEDEAD for the object file format, and in grepping for 4 character hex words that fit after "CAFE" (it seemed to be a good theme) I hit on BABE and decided to use it. At that time, it didn't seem terribly important or destined to go anywhere but the trash-can of history. So CAFEBABE became the class file format, and CAFEDEAD was the persistent object format. But the persistent object facility went away, and along with it went the use of CAFEDEAD - it was eventually replaced by RMI.

В русском толковании звучит примерно следующим образом (переведен только смысл, опущены несущественные детали):

Мы частенько захаживали в один ресторанчик (во времена когда мы создавали язык Java). Согласно местной легенде в стародавние времена в этом ресторанчике выступала местная рок-группа "Благодарный Мертвец" (Grateful Dead), которая потом стала очень известной. Мы промежь себя так и называли ресторанчик "У мертвеца" (Cafe Dead). Однажды кто-то заметил, что CAFEDEAD составлено из HEX символов CA FE DE AD - я потом применил это как сигнатуру для формата объектных файлов Java. Слово CAFE - вообще было "в тему" (на американском сленге Java означает второсортный кофе), для .class файлов я выбрал вместо DEAD - BABE (красотка), тогда никто не думал, что это так важно. Так и появилась сигнатура CAFEBABE, а CAFEDEAD в итоге умер и заменен протоколом RMI.

Где-то слышал, что BABE был также выбран далеко не случайно, дескать кто-то из команды флиртовал с девицей, которая обслуживала их в этом ресторанчике.

Читайте также: