我在jar中有一个类,我想调用一个方法。但是该方法具有抽象类的参数,并且抽象类是jar中类的内部方法。AbstractClassA是一个HIDDEN类。下面是代码:
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的具体实现来传递调用方法并获得更新方法回调?
应该这样做:
AbstractClassA a = new AbstractClassA() {
public void update(int remaining) {... do something...}
};
objectOfClassAusingReflection.inovke("invokeThisMethod", a);
不能在运行时创建抽象类或任何接口的实例。为它创建一个匿名类
public abstract class A {
public void fun(){....}
public abstract void absFun();
}
public class MyClass {
objectOfClassA = new A(){
public void absFun(){...}
}
}
或者您可以首先为抽象类创建实现,然后您必须为抽象类创建另一个扩展类A
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)
下面的代码应该可以工作——
在这里,我使用anonymus classes
为外部和内部类,然后在getdeclatedMethod
的帮助下调用您的更新方法。
"TestAbs"是jar类——
public abstract class TestAbs {
private void invokeThisMethod(AbstractClassA object) {
}
public abstract class AbstractClassA {
public void update(int remaining) {
}
}
}
然后像下面这样从"TestAbs1"调用jar类——
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调用隐藏在outerclass中的方法。
根据我的理解,有一种方法如下——
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文档中找到私有内部类的参考示例。
注释:在你的问题上下文中,由于你的内部类和外部类都在jar中,所以我认为你很难在jar中添加实现类。
如果你找到其他的选择,请告诉我们;
谢谢。