2011-03-04 3 views
0

: 그것은 (AChildClass.AStaticMethod)에서 호출 할 때 AStaticMethodAChildClass의 새로운 instace을 얻을 수 있도록자바의 정적 메서드에서 호출자 클래스의 인스턴스를 얻는 방법은 무엇입니까? 예를 들어

public class MyParentClass 
{ 
    static MyParentClass AStaticMethod() 
    { 
    //get a new childclass instace here 
    //modify this instance 
    return(ChildClassInstance); 
    } 
} 

public class AChildClass extends ParentClass {} 

수 있습니까?

스택 추적을 사용하거나 예외를 던져 잡는 것과 같은 기법을 사용하여 비슷한 코드를 보았습니다. 그러나이를 수행하는 더 깨끗한 방법을 찾고 있습니다.

AStaticMethod을 하위 클래스의 일반적인 초기화 프로그램이라고 생각하십시오.

나는 PHP에서 그랬던 것을 기억하지만 역동적 인 약한 타이핑과 언어 반영에 크게 의존하고 있습니다.

답변

2

나는 더 깨끗한 방법으로 을 찾고 있습니다.

이 작업을 수행 할 수있는 확실한 방법은 없습니다.

이니셜 라이저와 사용 클래스 (예 : AChildClass)를 별도의 클래스로 나누는 것과 같은 리팩토링을해야합니다.

+0

내가 할 수있는,하지만 나는 모든 자식 클래스는 클래스 이름을 변경 내 큰 초기화 방법을 추가하고, 과정을 일부 변경하는 방법에 필요할 때마다 반복해야합니다. 진정한 유지 보수의 악몽. –

+0

@ user644718 상속을 사용하여 처리 할 수 ​​있습니다. 실제 리엔지니어링 솔루션은 프로그램에 따라 다릅니다. –

0

나는 당신이 당신이 dynamic proxy에있는 모든 개체를 포장 또는 AoP를 사용하여 실행 경로에 후크 중 하나 접근 방식을 취할 수도있을 것 같군요. 메소드가 호출 될 때마다이 정보를 일부 정적 invocationLogging 클래스에 저장할 수 있습니다. 그러나, 나는 깨끗한 당신이 무엇을 요구하고 달성의 방법을 참조하십시오. 당신은 명시 적으로 던져 예외를 잡을 필요가 없습니다


, 당신은 배열의 첫 번째 요소는 마지막으로 호출 된 메소드에 해당해야하는 위치가

StackTraceElement[] trace = Thread.currentThread().getStackTrace(); 

를 사용하여 얻을 수 있습니다. 예를 들어,

public static void main(String[] args) { 
    first(); 
} 

public static void first() { 
    second(); 
} 

public static void second() { 
    StackTraceElement[] trace = Thread.currentThread().getStackTrace(); 

    System.out.println(trace[0].getMethodName()); // getStackTrace 
    System.out.println(trace[1].getMethodName()); // second 
    System.out.println(trace[2].getMethodName()); // first 
    System.out.println(trace[3].getMethodName()); // main 
} 
+2

주의 :'getStackTrace'의 실제 내용은 보장되지 않습니다. 예를 들어, 요소를 전달할 수 있습니다. 프로덕션 용도가 아닌 디버깅 용도로만 사용하십시오. –

관련 문제