Это очень возможно, но без дополнительных библиотек, таких как Reflections
, это сложно ... Это сложно, потому что у вас нет полного инструмента для получения имени класса. И я беру код моего класса ClassFinder
:
package play.util;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
/**
* Created by LINKOR on 26.05.2017 in 15:12.
* Date: 2017.05.26
*/
public class FileClassFinder {
private JarFile file;
private boolean trouble;
public FileClassFinder(String filePath) {
try {
file = new JarFile(filePath);
} catch (IOException e) {
trouble = true;
}
}
public List<String> findClasses(String pkg) {
ArrayList<String> classes = new ArrayList<>();
Enumeration<JarEntry> entries = file.entries();
while (entries.hasMoreElements()) {
JarEntry cls = entries.nextElement();
if (!cls.isDirectory()) {
String fileName = cls.getName();
String className = fileName.replaceAll("/", ".").replaceAll(File.pathSeparator, ".").substring(0, fileName.lastIndexOf('.'));
if (className.startsWith(pkg)) classes.add(className.substring(pkg.length() + 1));
}
}
return classes;
}
}
Различие, каждый - корректный способ определить main
, и другой не.
И да, это действительно имеет значение. Или
int main(int argc, char** argv)
или
int main()
надлежащее определение Вашего main
на спецификацию C++.
void main(int argc, char** argv)
не и был, IIRC, порочность, которая шла с компиляторами C++ более старой Microsoft.
Bjarne Stroustrup ясно дал следующее определение:
Определение
void main()
не является и никогда не было ни С++, ни даже не было С.
See reference.
В C++, main()
должен возвращать int
. Однако, C99 позволяет функциям main()
иметь тип возврата, отличный от int
. Вот выдержка из стандарта C99.
5.1.2.2.1 Запуск программы
Функция, вызываемая при запуске программы, называется main. Реализация объявляет об отсутствии прототип этой функции. Она должна быть определена с возвращаемым типом int и без параметры:
int main(void) { /* ... */ }
или с двумя параметрами (здесь упоминаются как argc и argv, хотя любые имена могут быть используются, так как они локальны для функции, в которой они объявлены):
int main(int argc, char *argv[]) { /* ... */ }
или эквивалент; или каким-либо другим способом реализации.
Также обратите внимание, что gcc действительно компилирует void main()
, хотя на практике при столкновении с закрывающей скобкой возвращает 0;
.
Необходимо использовать int main
. И C и стандарты C++ определяют, что main
должен возвратить значение.
Давным-давно я нашел эта страница (освободите основной (пустота)) , который содержал много причин за пределами, "в стандарте говорится, что это не допустимый" аргумент. В конкретных операционных системах/архитектуре это могло заставить стек становиться поврежденными и или другими противными вещами произойти.
Точка, C программы (и C++, то же) всегда (должен?) возвращают значение успеха или код ошибки, таким образом, они должны быть объявлены тем путем.
Для C++ только позволяется интервал. Для C C99 говорит только, что интервал позволяется. Предшествующий стандарт допускал void
возврат.
Короче говоря, всегда int
.
Если Вы идете спецификацией, то необходимо всегда объявлять main
возврат int
.
В действительности, тем не менее, большинство компиляторов позволит Вам сойти с рук любой, таким образом, реальная разница будет то, если Вы хотите / должен возвратить значение оболочке.