2015-08-26 70 views
7

我有一個我想調用方法的jar類。但是該方法具有抽象類的參數,抽象類是jar中的類的內部方法。 AbstractClassA是一個HIDDEN類。這裏是代碼:java反射方法中的抽象回調

public class A{ 

     private invokeThisMethod(AbstractClassA object){ 
     } 

     public abstract class AbstractClassA { 
       public void update(int remaining){} 
     } 
    } 



public class myClass{ 

    //using Reflection get object of class A 
     objectOfClassAusingReflection.inovke("invokeThisMethod", params) 
} 

問題在於如何創建AbstractClassA的具體實現來傳遞invoke方法並獲取update方法的回調?

+2

如果這涉及庫的API,則可能需要查看庫的文檔,以查找內部'AbstractClassA'的現有子類。通常你會發現(1)一個特定的實現,你可以通過它的構造函數實例化,或者(2)一個工廠類,它爲你提供了這樣一個實例的生成。最壞的情況,(3)您必須按照KDM的回答中的建議自行實施。 – Carsten

回答

0

像這樣的東西應該工作:

AbstractClassA a = new AbstractClassA() { 
     public void update(int remaining) {... do something...} 
}; 

objectOfClassAusingReflection.inovke("invokeThisMethod", a); 
+0

否。創建抽象類的對象是不可能的。 – user531069

+0

這是AbstractClassA的匿名類。 –

+0

@ user531069注意構造函數背後的花括號。這意味着一個匿名的子類。 'new AbstractClassA(){/ *特定實現* /}'。 – Carsten

0

不能創建抽象類的實例或運行任何接口。 而是爲此創建一個匿名類。

public abstract class A { 
    public void fun(){....} 
    public abstract void absFun(); 
} 

public class MyClass { 
    objectOfClassA = new A(){ 
     public void absFun(){...} 
    } 
} 

或者你可以先創建實現了抽象類,你將不得不創建另一個類延伸的

class AWrapper extends A { 
    public class ImplementationClassA extends AbstractClassA { 
     // override abstract functions... 
    } 
} 

現在你可以使用這個Awrapper

AWrapper wrapperObj = new AWrapper(); 
A obj = wrapperObj; // just to make it clear that A can hold wrapperObj as it is implementation of it. 
A.AbstractClassA absObj = wrapperObj.new ImplementationClassA(); 
... 
objectOfClassAusingReflection.inovke("invokeThisMethod", params) 
0

以下代碼應該工作 -

在這裏,我用anonymus classes爲外部和內部類,然後在getdeclatedMethod的幫助下調用您的更新方法。

「TestAbs」 是你的罐子分類 -

public abstract class TestAbs { 

    private void invokeThisMethod(AbstractClassA object) { 
    } 

    public abstract class AbstractClassA { 
    public void update(int remaining) { 
    } 
    } 

} 

然後從 「TestAbs1」 像below--

public class TestAbs1 { 

    public static void main(String[] args) { 
    TestAbs.AbstractClassA abs = new TestAbs() { 

     AbstractClassA a = new AbstractClassA() { 
     public void update(int remaining) { 
      System.out.println("Inside update method : " + remaining); 

     } 
     }; 
    }.a; 

    try { 
     int i = 1; 

     Class<?> class1 = Class.forName("app.test.mytest.TestAbs$AbstractClassA"); -- (*Getting instance of inner class*) 


     System.out.println(class1.getDeclaredMethod("update", int.class)); 
     class1.getDeclaredMethod("update", int.class).invoke(abs, i); 

    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    } 

} 

我得到的輸出是呼喚你的罐子類 -

public void app.test.mytest.TestAbs$AbstractClassA.update(int) 
Inside update method : 1 

回答您的意見: -

我從你的評論中瞭解到,你想從隱藏在外部類中的abstractClass中調用方法。

按我的理解,有一個辦法像below--

public abstract class TestAbs { 

     private void invokeThisMethod(AbstractClassA object) { 
     } 

     private abstract class AbstractClassA { --- your hidden class 
     public void update(int remaining) { 
     } 
     } 

    public class ImplementedClass extends AbstractClassA{ -- use implemented class here 
     .... 
     ... 
    } 

    } 

而在這之後,用你的ImplementedClass上述同樣的方式。 你可以從java文檔中找到專用內部類here的參考示例。

注意:在你的問題上下文中,由於你的內部類和外部類是在jar中,所以我認爲你很難在你的jar中添加實現類。

如果您發現任何替代方法,請讓我們知道這一點;

謝謝。

+0

這看起來非常好但並沒有完全解決我的問題。有沒有什麼辦法,而不是調用更新方法,每當其他類調用它時,我都會聽它?就像我觸發更新時得到的回調一樣。 – user531069

+0

什麼是AbstractClassA是一個隱藏的類,這意味着我不能直接訪問它,就像你做的那樣。我如何使用反射? – user531069