java反射方法中的抽象回调



我在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中添加实现类。

如果你找到其他的选择,请告诉我们;

谢谢。

相关内容

  • 没有找到相关文章