-
10-10-2019 - |
質問
され、次の授業をうまく使いこなせる方法の反射の初期化機能は、親クラス(es)とそのサブクラス:
public class Test {
public static void main(String[] args) {
ExtendedElement ee = new ExtendedElement();
initialize(ee);
}
public static void initialize(Element element) {
System.out.println(element.getClass());
initialize(element.getClass());
}
public static void initialize(Class clazz) {
System.out.println(clazz.getClass());
}
}
public class Element {
protected String value;
public String getValue() { return value; }
public void setValue(String value) { this.value = value; }
}
public class ExtendedElement extends Element {
protected String extendedValue;
public void setExtendedValue(String extendedValue) {
this.extendedValue = extendedValue;
}
public String getExtendedValue() { return extendedValue; }
}
私らしさをどうparamertizeの初期化機能の試験クラスとしてのclazzパラメータの原型である。
私が行う必要があるのは初期化するクラス階層が何をしていただくために初期化のクラスのサブクラス要素になります。
以下のようなもの:
public void initialize(Class clazz) {
if (Element.class.isInstance(clazz.getClass().getSuperclass()) {
initialize(clazz.getClass().getSuperclass());
}
//Work to call initialize function
}
編集1:
することはできないのでしょうかparameterize上記疑似機能別の型のオブジェクトを呼び出し機能が必要ですか?
どのようにしていいを回避するのと同じ方法でオーバーライドのためのそれぞれの授業をとめることにより継承のための私のセレンの2ページオブジェクト。今必要なのはできるがintrospectのスーパークラス(es)の自分と初期ひとりひとりのWebElement分野の先を走行試験れます。
これを注入し、さらに複雑な思いを試験する記述を用いた式言語です。私は怠け者だ荷私の豆を使用して、InitializingBeanインターフェースの試みを初期化する方法について私のWebElements前の使用は避けNPEs.
があったのでラップのWebElementsとカスタムオブジェクト、うまく伝わらないこともあ注入の立地戦略につい春を再利用していま多くの点で異なるid/クラス名に依存しいアプリケーションで使用する;これ以前のmeってない変更はできませんのでこの時期にもかかわらず、議論の整合性).例えば今日からウィジェットとは異なる詳細がまだ一ヶ月も年月など---。いコミュニケーションを取り合使ってみましたabstractクラスなので、休憩これらの共通性をその少なくとも共通の分母とから新たな方法論を提供することである。いを必要とすることができるように以下の私の基底クラス:
public abstract class PageObject implements InitializingBean {
...
public void afterPropertiesSet() {
//Pass in concrete impl we are working with - this allows me to initialize properly
initializeWebElements(this.getClass());
}
...
public void initializeWebElements(Class clazz) {
//This does not grab inherited fields, which also need to be initialized
for (Field field : clazz.getDeclaredFields()) {
if (WidgetElement.class == field.getType()) {
Method getWidgetElement = clazz.getDeclaredMethod("get" +
StringUtils.capitalize(field.getName()), new Class [] {});
WidgetElement element =
(WidgetElement) getWidgetElement.invoke(this, new Object [] {});
element.initElement();
}
}
解決 3
ここでは私の根本的解決策は、質問に開かれば集まる何らかの良い答えが私の使用例です。
public abstract class PageObject implements InitializingBean {
...
public void afterPropertiesSet() {
Class clazz = this.getClass();
do {
initializeElements(clazz);
clazz = clazz.getSuperclass();
} while (clazz != null);
}
他のヒント
できないメソッドの呼び出しを特定です。お客様のアクセスする super
キーワード内のクラスそのものです。
この作業は、してください super.initialize()
内からの各サブクラス、直通です。
これはC++、 ができ 呼び特有の方法で特定のレベルの遺産の上位の階層となります。
私らしさをどうparameterizeの初期化機能の試験クラスとしてのclazzパラメータの原型である。
あおえする必要があるの汎用型のパラメータで宣言しまし Class<?>
.
いかりの初期化方法に思いであり、これまで多くの問題:
まいつ initialize
方法を取るインスタンスの Element
)の引数としては、別を取る Class
オブジェクトを引数に使います。これって本当にリンゴやみかんも...必要があると説明しようとしています。
お試み肉付けする手法を含みます:
Element.class.isInstance(clazz.getClass().getSuperclass())
こい評価をtrueにない場合 Class
オブジェクトが インスタンス の Element
クラスです。(また、 clazz.getClass().getSuperclass()
実際のと同じ java.lang.Object.class
.のクラスは、 Class
オブジェクト java.lang.Class
そのスーパークラスが java.lang.Object
).
ができない何をすべきなどを明らかにして何をしようとしている。