使用Reflection访问方法形成嵌套类

时间:2018-03-04 05:51:00

标签: java reflection classloader

我创建了下面的类,它是在创建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();

的方法

0 个答案:

没有答案