이미 발견 했으므로 MIDP는 클래스의 수퍼 클래스를 가져 오는 방법이나 응용 프로그램의 모든 클래스를 열거하는 방법을 제공하지 않습니다.
여러분이 할 수있는 일은 직접 클래스 계층을 추적하는 것입니다.
abstract class View {
protected View() {
classHierarchy.add(this.getClass());
}
}
하지만 불행히도이 : 새 개체가 슈퍼 클래스 생성자에서 (만약 이미 존재하지 않음) 글로벌 수준의 컬렉션에 자신의 클래스를 추가 할 수 있기 때문에 공통의 슈퍼 클래스를 갖는
는
, 그것은 약간 쉽게 인스턴스가 생성되지 않기 때문에 추상 클래스에서는 작동하지 않습니다.
클래스의 알려진 하위 집합에 대한 수퍼 클래스/하위 클래스 관계를 쉽게 추적 할 수 있습니다. 예 :
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;
public class ClassHierarchy {
public ClassHierarchy() {
childToParentMap = new Hashtable();
parentToChildMap = new Hashtable();
parentToChildMap.put(Object.class, new Vector());
}
public boolean addClass(Class toAdd) {
if (toAdd.isInterface()) return false;
if (toAdd.equals(Object.class)) return false;
if (childToParentMap.get(toAdd) != null) return false;
addClassBelow(toAdd, Object.class, new Vector());
return true;
}
public Class getParent(Class subclass) {
return (Class) childToParentMap.get(subclass);
}
private void addClassBelow(Class toAdd, Class parent, Vector initialChildren) {
Vector children = (Vector) parentToChildMap.get(parent);
Class reparented;
do {
reparented = null;
for (Enumeration childEnum = children.elements();
childEnum.hasMoreElements();
) {
Class child = (Class) childEnum.nextElement();
if (child.isAssignableFrom(toAdd)) {
addClassBelow(toAdd, child, initialChildren);
return;
} else if (toAdd.isAssignableFrom(child)) {
children.removeElement(child);
initialChildren.addElement(child);
childToParentMap.put(child, toAdd);
// Guard against concurrent modification
reparented = child;
break;
}
}
} while (reparented != null);
children.addElement(toAdd);
childToParentMap.put(toAdd, parent);
parentToChildMap.put(toAdd, initialChildren);
}
private Hashtable childToParentMap;
private Hashtable parentToChildMap;
}
하지만 나중에 추가되는 중간 클래스를 "놓칠"수 있습니다. 당신이 이러한 클래스가있는 경우 : 트리에
Object >= View >= A >= B >= C
및 A
를 추가하고 C
을하고 C
의 슈퍼 클래스를 위해 그것을 요구 그것은 당신에게 A
을 줄 것이며, 나중에 B
를 추가 한 경우는 C
의 슈퍼 클래스로 A
을 대체 할 것이다 그러나 잘못된 스타일러가 C
의 일부 인스턴스에 반환 될 때까지는 아닙니다.
그래서 선생님 클래스 (정의 된 스타일러가있는)를 먼저 트리에 추가해야한다는 제한을 추가해야한다고 생각합니다. 아마도 createStylerForViewClass
을 재정의하는 클래스의 정적 초기화 프로그램 블록이나 뷰 클래스 자체의 정적 초기화 프로그램에서 가져온 것일 수 있습니다.
나는 다른 하나의 악을 해킹 생각 못했지만, 난 정말 추천 할 수 없습니다
이
View
생성자에서 새로운 Exception
을 만들 수 있지만 그것을 던져하지 않습니다.
- 일시적으로
ByteArrayOutputStream
에서 스택 추적을 구문 분석 원래 값
- 에 예외
- 에
ByteArrayOutputStream
- 전화
printStackTrace()
에 글을 자신의 작가 복원 System.err
에 대한 System.err
을 교환합니다. 중간 클래스 생성자의 이름은 스택 추적에 포함됩니다. 이제 Class.forName()
을 사용하여 검색 한 다음 트리에 추가 할 수 있습니다.
모든보기 클래스에 공통된 수퍼 클래스가 있습니까? 그리고이 메소드 ('createStylerForViewClass'와'getStylerForViewClass')는 그 수퍼 클래스에 속할 것입니까? 그렇다면'clazz' 매개 변수가 필요한 이유는 무엇입니까? – finnw
예 그들은 공통의 수퍼 클래스를 가지고 있지만, 당신은이 메소드들을 구현하지 않을 것입니다. getStylerForViewClass()를 자신의 클래스로 호출하면 가장 적합한 스타일러를 얻을 수 있습니다. – PeyloW