Мне кажется, что нарезка - это не столько проблема, которая отличается от того, когда ваши собственные классы и программы плохо архивируются / разработаны.
Если я передаю объект подкласса в качестве параметра для метод, который принимает параметр суперкласса типа, я должен, конечно, знать об этом и знать внутренне, вызываемый метод будет работать только с объектом суперкласса (aka baseclass).
Мне кажется, необоснованное ожидание того, что предоставление подкласса, где запрашивается базовый класс, каким-то образом приведет к конкретным результатам подкласса, вызовет проблему разрезания. Его либо плохой дизайн при использовании метода, либо недостаточная реализация подкласса. Я предполагаю, что это обычно результат жертвовать хорошим дизайном ООП в пользу целесообразности или повышения производительности.
Java exec
не может запускать такие командные команды. Если вы хотите запустить команду оболочки, вам нужно явно вызвать оболочку; например,
Process proc = run.exec(new String[]{"/bin/sh", "-c", "echo 5 | ./prog"});
Для получения более подробной информации о том, что делает Java с этим, прочитайте javadocs для exec(String)
и exec(String[])
. Обратите внимание, что это «методы удобства», и вам нужно следовать цепочке ссылок на основные методы для полного понимания того, что говорит javadoc.
Если вы хотите получить более подробную информацию о том, как обрабатываются Java это, есть исходный код ...
Если вы хотите глубже понять, почему Java не не обрабатывает сам синтаксис оболочки, вам, вероятно, необходимо пройти глубокое погружение в архитектуру и философию систем UNIX / Linux и разделение проблем между приложением, операционной системой и командной оболочкой. Обратите внимание, что существуют разные разные оболочки, каждая из которых имеет (потенциально) разные правила для цитирования, разделения аргументов, перенаправления, труб и т. Д.
Объяснение решения:
exec(String)
не будет разделять команду на на одну команду и аргументы правильно. Это невозможно. Это пример, когда в конвейере есть две команды . exec
Java не поддерживает синтаксис оболочки ... как объясняет javadoc. sh -c "a b c"
означает «использовать« sh »для запуска командной строки« ab c ». FWIW, технически возможно построить и запустить конвейер исключительно на Java (т.е. не полагаясь на внешнюю оболочку), но, как правило, не стоит усилий. Вы уже ввели зависимость от платформы, запустив внешние команды, поэтому дополнительная зависимость в форме конкретной команды и синтаксиса оболочки не делает вещи значительно хуже.
/bin/sh
и-c
или где я могу найти подробную информацию о работеRuntime.exec(...)
? – Jay Foreman 25 August 2013 в 01:53/bin/sh
и-c
в javadoc и не так ли? Итак, да, я посмотрел туда первым. – Jay Foreman 25 August 2013 в 02:07