【问题标题】:calling method from private static nested class从私有静态嵌套类调用方法
【发布时间】:2016-01-05 05:50:01
【问题描述】:

我有一个不太好的遗留代码涉及使用私有静态类的方法我想知道是否可以调用此类中的方法。我正在为此编写测试。 如果这是一种方法,我知道可以通过反射来完成,但它不是。

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));
    }
  }
}

【问题讨论】:

  • '静态内部'在术语上是矛盾的。不清楚为什么它是一个嵌套类。不清楚你在问什么。
  • 我认为它们的意思是静态嵌套类。
  • 请提供代码示例,您需要在哪里调用ProductValueClass的方法
  • @Ernz 当然。它是静态的,而且是嵌套的。

标签: java class methods private


【解决方案1】:

我相信您正在寻找创建私有内部类的实例?如果是这种情况,此链接已经为您提供了解决方案: 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));

【讨论】:

  • 它不是内部类,所以你的链接不适用。
  • ProductValueClass 是 FiscalReport 的私有内部类。您要访问的是什么?我用访问 ProductValueClass 方法的示例代码更新了我的答案
  • 我刚试过你的方法,但似乎找不到方法。 (没有这种方法例外)。甚至做了一些改动
  • 您必须将“wantedMethod”更改为您想要的方法名称。您还必须更改调用调用以将正确的参数传递给方法。
  • 它是静态的。因此,它不是内在的。 Can't be both。它是一个静态嵌套类。您的链接是关于内部类的,特别是关于如何提供外部实例的,这对于静态嵌套类来说不是必需的。您现在发布的代码也有同样的问题。
猜你喜欢
  • 2017-01-13
  • 1970-01-01
  • 2019-03-27
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
  • 2015-06-26
  • 1970-01-01
相关资源
最近更新 更多