2012-02-02 2 views
0

Как запустить метод Foo() в классе А без каких-либо изменений в этом классеКак запустить метод из окончательного класса с помощью частного конструктора?

public final class A{ 

    private A(){ 
     System.exit(0); 
    } 
    public void foo(){ 

     System.out.println("from foo"); 
    } 

} 
+4

Почему ваш конструктор закрывает всю систему? Мне любопытно. – FrankieTheKneeMan

+2

@FrankieTheKneeMan Ha! Я даже не взглянул на тело конструктора. Да, это выглядит как преднамеренно странная головоломка или какое-то серьезное плохое кодирование. Побочные эффекты в конструкторах, как правило, не так велики, и вы не можете иметь гораздо больший побочный эффект, который закрывает JVM ... –

+0

Мне любопытно узнать, какое преимущество мы можем получить как класс этого типа? – kosa

ответ

1

Без делать что-то подобное с использованием отражения или манипуляцию байткодом возиться с доступностью ...

«правильный» способ сделать это, чтобы получить экземпляр класса некоторых других путь. Например, если есть статический заводский метод или готовые экземпляры, к которым вы можете получить доступ. Причиной такого частного конструктора является управление построением класса. (Например, реализации перечислений имеют частный конструктор, так что вы не создаете дополнительные экземпляры за пределами статических.)

Если вы перешагните это, то кто-то (либо вы, либо оригинальный автор класса) является что-то не так.

+0

Как мы можем получить предварительно созданный экземпляр, когда конструктор по умолчанию является закрытым? – kosa

+1

@thinksteep. Что-то в классе должно было бы вызвать для вас конструктор, как статический заводский метод, статический инициализатор или что-то в вложенном/содержащем классе (это фактически проходит статический метод под обложками). Если такая вещь существует, то ваш класс не является необразованным без «трюков», поэтому я бы сказал, что он, вероятно, сломан. –

1

Вы можете создать экземпляр класса без вызова конструктора. См. Этот вопрос: Is it possible to create an instance of an object in Java without calling the constructor?

Вы можете использовать objenesis, чтобы сделать это за вас. После того, как вы получили экземпляр A без вызова конструктора, вызов foo прост.

+0

Кажется, законно ..... –

+0

Если класс сделал свой конструктор закрытым, это почти наверняка по уважительной причине. –

Смежные вопросы