我创建了下面的类,它是在创建Object存储库时由LeanFT Automation工具自动生成的。下面是该文件的精简版本,只是为了提出一个想法:
public class Calculator extends AppModelBase {
private CalculatorWindow CalculatorWindow;
public Calculator() throws GeneralLeanFtException {
CalculatorWindow = new CalculatorWindow(this);
}
public CalculatorWindow CalculatorWindow() {
return CalculatorWindow;
}
//Inner class
public class CalculatorWindow extends WindowNodeBase {
private Button4 Button4;
public CalculatorWindow(AppModelBase applicationModel) throws GeneralLeanFtException {
Button4 = new Button4(this, applicationModel);
}
public Button4 Button4() {
return Button4;
}
//Inner class
public class Button4 extends ButtonNodeBase {
public Button4(TestObject parent, AppModelBase applicationModel) throws GeneralLeanFtException {
super(parent, applicationModel);
setDisplayName("Button4");
}
}
}
}
如您所见,Calculator类包含一个内部类CalculatorWindow,它又包含一个内部类Button4。
在这个项目中,在另一个班级我可以做类似的事情 -
Calculator caclModel = new Calculator();
caclModel.CalculatorWindow().Button4().click();
现在,我需要使用Reflection从不同的项目访问此类的成员。到目前为止,我所拥有的是:
File file = new File("C:/TestProj/target/classes");
URL classUrl = file.toURL();
URL[] cUrls = new URL[] { classUrl };
File sdkJar = new File("C:/Jars/14.0.0/sdk-14.0.0.JAR");
URL parentUrl = sdkJar.toURL();
URL[] pUrls = new URL[] { parentUrl };
// Load jar
URLClassLoader parentCL = new URLClassLoader(pUrls, LoaderTest.class.getClassLoader());
// Load target class
ClassLoader cl = new URLClassLoader(cUrls, parentCL);
Class<?> clsCalc = cl.loadClass("Calculator");
Object oCalc = clsCalc.newInstance();
Class<?> clsApp = parentCL.loadClass("com.hp.lft.sdk.internal.AppModelBase");
Class<?> clsWin = cl.loadClass("Calculator$CalculatorWindow");
Constructor<?> cWin = clsWin.getDeclaredConstructor(clsCalc, clsApp);
// --> Works fine so far. After this, I should be able to do something like -
// oCalc.CalculatorWindow().Button4().click();
// Tried the below
Object oWin = cWin.newInstance(oCalc); // throws java.lang.IllegalArgumentException: wrong number of arguments
// Class<?> clsBut = cl.loadClass("Calculator$CalculatorWindow$Button4");
// Constructor<?> cBut = clsBut.getDeclaredConstructor(clsWin);
//
// Method click = clsBut.getDeclaredMethod("click");
// click.invoke(cBut, null);
在我最内层的嵌套类中访问该方法的正确方法是什么,以便实现类似oCalc.CalculatorWindow().Button4().click();