2013-05-21 2 views
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); 
    } 

EDIT:

я нашел еще один публичный метод в банке файл, который делает вышеуказанную работу.

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

Частные методы являются частными по причине, поэтому никто за пределами класса не называет их. Вы не сможете это сделать, если не попытаетесь использовать рефлексию, и даже тогда я не уверен, что это сработает. – cmbaxter

+1

Отражение - это путь, но никто на самом деле его не рекомендует: http://stackoverflow.com/questions/880365/any-way-to-invoke-a-private-method – andreih

+0

Прочитайте [Вызывающие методы] (http://docs.oracle.com/javase/tutorial/reflect/member/methodInvocation.html) Сеанс [Oracle Reflection Trail] (http://docs.oracle.com/javase/tutorial/reflect/index.html). –

ответ

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. 
} 

отметить также, что если вы не можете получить доступ к методу непосредственно в библиотеке третьей стороны, чем это, скорее всего, предполагается, что путь. Взгляните на метод call hierarchy метода private и посмотрите, найден ли метод public, который выполняет вызов private, а также делает то, что вам нужно.

Библиотеки часто проектируются таким образом, что метод public выполняет некоторую проверку (все заданные параметры, аутентифицированные и т. Д.), А затем передает вызов методу private для выполнения фактической работы. Вы почти никогда не хотите обойти этот процесс.

+2

+1 если возможно, всегда используйте обертку вместо отражения. – andreih

+0

Вам не нужно указывать возврат для importBook (epubBookPath) внутри общедоступного метода. –

+0

@AlpeshGediya. Вы правы, спасибо. Я починил это. –

0

Частные методы недоступны вне класса, который он определен. Сделать общедоступным.

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...)

+0

Этот метод работает с importBook() как частная функция? –

+0

@ Hao Да, 'setAccessible' разрешает это. –

+0

Очень круто! Это поможет во многих случаях. Благодаря. + 1 –

2

Использование отражения, чтобы получить вам метод и установить Accessible в true, затем вызвать метод с использованием BookView экземпляра объекта и необходимые параметры (путь строки) с помощью заявления как показано ниже:

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

Пример кода, как показано ниже:

Method method = BookView.getDeclaredMethod("importBook"); 
method.setAccessible(true); 
Boolean result = (Boolean)method.invoke(bookObject, epubBookPath); 
Смежные вопросы