2015-10-07 103 views
0

我有一個不太好的遺留代碼涉及使用私有靜態類的方法我想知道是否可以調用此類中的方法。我正在爲其寫作測試。 我知道這可以用反射來完成,如果這是一種方法,但它不是。來自私有靜態嵌套類的調用方法

public class FiscalReport implements Report 
    { 
    private void readProductValueClass() 
    { 
    Connection dbc = null; 
    Statement st = null; 
    ResultSet rs = null; 
    String q = null; 
    try 
    { 
    dbc = db.getConnection(); 
    dbc.setAutoCommit(false); 
    st = dbc.createStatement(); 

    routerClassMap = new HashMap(); 

    q = "SELECT * FROM sales_report"; 

    rs = st.executeQuery(q); 
    while(rs.next()) 
    { 
    ProductValueClassrc = new ProductValueClass(); // <---this new class 
                // is where it gets called... 
    ..... 

    } 

    private static class ProductValueClass 
    { 
    public String name; 
    public String emp; 
    public String sale; 
    public String option; 
    public String value; 
    public Query q; 
    public Query qr 
    public Query sql; 

    public String toString() 
    { 
     return 
     "[" + 
     name + ", " + 
     emp + ", " + 
     sale + ", " + 
     option + ", " + 
     values + 
     "]"; 
    } 

    public Query query() 
    { 
    return q.add(q(notEqual(qr)? null: sql)); 
    } 
    } 
} 
+0

「靜態內部」是矛盾的。不清楚它爲什麼是嵌套類。不清楚你在問什麼。 – EJP

+0

我假設他們的意思是靜態嵌套類。 – Emz

+0

請提供代碼示例,您需要在哪裏調用ProductValueClass的方法 –

回答

0

我相信你正在尋找創建一個私人內部類的實例嗎?如果是這樣的情況下,這種聯繫已經有你的解決方案: Instantiate private inner class with java reflection

您可以訪問ProductValueClass的方法是這樣的:

try { 
    //creating parent object 
    Object parent=new FiscalReport(); 

    //creating inner class object 
    Class<?> innerClass=Class.forName("FiscalReport$ProductValueClass"); 

    //inner object must know type of outer class 
    Constructor<?> constructor=innerClass.getDeclaredConstructor(FiscalReport.class); 

    //private inner class has private default constructor 
    constructor.setAccessible(true); 
    //inner object must know about its outer object 
    Object child = constructor.newInstance(parent); 

    //invoking method on inner class object 
    Method method = innerClass.getDeclaredMethod("wantedMethod",new Class<?>[]{}); 
    method.setAccessible(true);//in case of unaccessible method 
    method.invoke(child,new Object[]{}); 

} catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e1) { 
    // TODO Auto-generated catch block 
    e1.printStackTrace(); 

}

因爲你的內部類是靜態的嘗試此:

Class<?> clazz = Class.forName("FiscalReport$ProductValueClass"); 
Object c = clazz.newInstance(); 

Class<?> productValueClass = c.getClass(); 
Method toStringMethod = productValueClass.getMethod("toString", new Class<?>[] {}); 
toStringMethod.setAccessible(true); 
System.out.println(toStringMethod.invoke(c)); 
+0

這不是一個內部類,所以你的鏈接不適用。 – EJP

+0

ProductValueClass是FiscalReport的私有內部類。你試圖訪問什麼?我使用示例代碼更新了我的答案,以訪問ProductValueClass的方法 –

+0

我只是試過你的方式,但它似乎找不到方法。 (沒有這樣的方法例外)。即使做了一些改動 – logger

相關問題