[英]How to call a private method of a class in different package
有一个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();
}
如果要这样做,则应将其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
方法以完成实际工作。 您几乎永远都不想解决该过程。
通过反射,您将需要一个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...)
使用反射获取方法并将Accessible
设置为true
, 然后使用BookView
Object实例和必需的参数(路径字符串)使用以下语句来调用该方法 :
Boolean result = (Boolean)method.invoke(bookObject, epubBookPath);
示例代码如下:
Method method = BookView.getDeclaredMethod("importBook");
method.setAccessible(true);
Boolean result = (Boolean)method.invoke(bookObject, epubBookPath);
无法在定义的类之外访问私有方法。 公开。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.