Джастин имеет общий корпус; Я хотел бы отметить два особых случая, продемонстрированные этой Snippit:
import java.util.Comparator;
public class WhoCalledMe {
public static void main(String[] args) {
((Comparator)(new SomeReifiedGeneric())).compare(null, null);
new WhoCalledMe().new SomeInnerClass().someInnerMethod();
}
public static StackTraceElement getCaller() {
//since it's a library function we use 3 instead of 2 to ignore ourself
return Thread.currentThread().getStackTrace()[3];
}
private void somePrivateMethod() {
System.out.println("somePrivateMethod() called by: " + WhoCalledMe.getCaller());
}
private class SomeInnerClass {
public void someInnerMethod() {
somePrivateMethod();
}
}
}
class SomeReifiedGeneric implements Comparator<SomeReifiedGeneric> {
public int compare(SomeReifiedGeneric o1, SomeReifiedGeneric o2) {
System.out.println("SomeRefiedGeneric.compare() called by: " + WhoCalledMe.getCaller());
return 0;
}
}
Печатается:
SomeRefiedGeneric.compare() called by: SomeReifiedGeneric.compare(WhoCalledMe.java:1)
somePrivateMethod() called by: WhoCalledMe.access$0(WhoCalledMe.java:14)
Несмотря на то, первый называется «напрямую» из main()
и второй из SomeInnerClass.someInnerMethod()
. Это два случая, когда между этими двумя методами существует прозрачный вызов.
- В первом случае, это происходит потому, что мы называем bridge method к общему методу, добавленный компилятор, чтобы обеспечить SomeReifiedGeneric может быть использованы в качестве сырьевого типа.
- Во втором случае это потому, что мы вызываем частный член WhoCalledMe из внутреннего класса. Для этого компилятор добавляет синтетический метод в качестве промежуточного для переопределения проблем видимости.
Я неоднократно поражаюсь тому, что странные хаки, некоторые люди «хотели бы написать». Не было никакого преступления. – delnan
@del Это на самом деле не хак. Это в основном форма ведения журнала, которая может быть очень полезной. – jjnguy
geeking out .. :-) – DuduAlul