0

有一个 BookView.class 有一个私有方法定义如下

  public class BookView{
    private boolean importBook(String epubBookPath){
    //The function that adds books to database.
    }
  }

我正在尝试从不同的包中调用此函数。我的代码是

    protected void onPostExecute(String file_url) {
        // dismiss the dialog after the file was downloaded
        dismissDialog(progress_bar_type);

        /*Now we add the book information to the sqlite file.*/
        TextView textView=(TextView)findViewById(R.id.textView1);
        String filename = textView.getText().toString();
        String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
        String epubBookPath = baseDir+filename;
        Log.i("epubBookPath:",epubBookPath); //No errors till here!

        try {
            Method m=BookView.class.getDeclaredMethod("importBook");
            m.setAccessible(true);//Abracadabra 
            //I need help from here! How do i pass the epubBookPath to the private importBook method.
        } catch (NoSuchMethodException e) {

            e.printStackTrace();
        }
        Intent in = new Intent(getApplicationContext(),
                CallEPubUIActivity.class);        
        startActivity(in);
    }

编辑:

我在执行上述工作的 jar 文件中找到了另一个公共方法。

  public void jsImportBook(String epubBookPath) {
     if (!BookView.this.importBook(epubBookPath))
     return;
   BookView.this.createBookshelf();
  }
4

4 回答 4

11

如果你想这样做,你应该制作它public或制作一个public包装方法。

如果那不可能,您可以解决它,但这很难看而且糟糕,您应该有充分的理由这样做。

public boolean importBook(String epubBookPath){
    //The function that adds books to database.
}

或者

public boolean importBookPublic(String epubBookPath){
    return importBook(epubBookPath);
}
private boolean importBook(String epubBookPath){
    //The function that adds books to database.
}

另请注意,如果您无法直接在第三方库中访问该方法,则很可能是这种方式。查看方法的调用层次结构private看看您是否找到了一种public方法可以调用该方法private并且也可以满足您的需要。

库通常被设计成一种public方法进行一些检查(所有参数给定,经过身份验证等),然后将调用传递给private方法以完成实际工作。你几乎从不想绕过这个过程。

于 2013-05-21T13:53:47.293 回答
8

通过反射,您需要一个 BookView 实例来调用该方法(除非它是静态方法)。

BookView yourInstance = new BookView();
Method m = BookView.class.getDeclaredMethod("importBook");
m.setAccessible(true);//Abracadabra 
Boolean result = (Boolean) m.invoke(yourInstance, "A Path"); // pass your epubBookPath parameter (in this example it is "A Path"

您正在寻找的方法是Method#invoke(Object, Object...)

于 2013-05-21T13:55:19.143 回答
2

使用反射获取方法并设置Accessibletrue然后使用BookViewObject 实例和所需参数(路径字符串)调用方法,使用如下语句:

     Boolean result = (Boolean)method.invoke(bookObject, epubBookPath);

示例代码如下:

Method method = BookView.getDeclaredMethod("importBook");
method.setAccessible(true);
Boolean result = (Boolean)method.invoke(bookObject, epubBookPath);
于 2013-05-21T13:55:25.343 回答
0

私有方法不能在它定义的类之外访问。公开。

于 2013-05-21T13:54:24.170 回答