Получение пути к каталогу в .class файл, содержащий основной

Если вы используете приведение в стиле C для преобразования в Alpha*, аналогично static_cast перед использованием динамического приведения, то динамическое приведение не дает никакого эффекта. здесь ваш код выполняется, потому что оба класса имеют одинаковый интерфейс, но в действительности это неопределенное поведение.

Обычно вы хотите использовать динамическое приведение к восходящему / нисходящему из / в базовый класс в / из его производного класса.

Например, если мы добавим базовый интерфейс, затем преобразуем указатель void * в этот базовый класс, а затем используем динамическое приведение, чтобы выполнить преобразование, код работает как положено и печатается только один раз. ]

#include <stdio.h>

class Speaker {
public:
  virtual void Speak() = 0;
};

class Alpha: public Speaker {
public:
  virtual void Speak() { printf("A"); }
};

class Beta: public Speaker {
public:
  virtual void Speak() { printf("B"); }
};

int main(){
  void *p = new Alpha;
  // Convert to base type, using static_cast                                    
  Speaker *s = static_cast<Speaker *>(p);
  // Attempt Upcasts                                                            
  Alpha*a = dynamic_cast<Alpha*>(s);
  Beta*b = dynamic_cast<Beta*>(s);

  // See if it worked                                                           
  if (a)
    a->Speak();
  if (b)
    b->Speak();
  return 0;
}

Выходы: A

13
задан Hamza Yerlikaya 22 April 2009 в 16:47
поделиться

4 ответа

URL main = Main.class.getResource("Main.class");
if (!"file".equalsIgnoreCase(main.getProtocol()))
  throw new IllegalStateException("Main class is not stored in a file.");
File path = new File(main.getPath());

Обратите внимание, что большинство файлов классов собраны в файлы JAR, поэтому не будет работать в каждом случае (отсюда IllegalStateException ). Тем не менее, вы можете найти JAR, который содержит класс с помощью этого метода, и вы можете получить содержимое файла класса, подставив вызов getResourceAsStream () вместо getResource () ,

28
ответ дан 1 December 2019 в 20:57
поделиться

Согласно http://www.cs.caltech.edu/courses/cs11/material/java/donnie/java-main.html , №. Тем не менее, я предлагаю прочитать $ 0 (имя программы) на Java? Откройте для себя основной класс? , который, по крайней мере, дает вам основной класс.

0
ответ дан 1 December 2019 в 20:57
поделиться

Для чего вам это нужно? Если вам это нужно, чтобы получить какие-либо файлы, находящиеся в том же каталоге, то для этого Class.getResourceAsStream () .

0
ответ дан 1 December 2019 в 20:57
поделиться

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

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

PS: Методы java.io.File.createTempFile () идеально подходят для предотвращения временных конфликтов файлов. потому что они автоматически генерируют уникальные имена файлов.

0
ответ дан 1 December 2019 в 20:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: