2017-04-02 59 views
0

我有两个类:为什么ArrayList中的值在使用反射调用方法后消失?

  1. 子类:接待员类两种方法ReadDoctorList(字符串的readLine)和DisplayDoctorList()。

  2. 父类:类与ReadLine方法,其中我通过的方法作为参数,该方法是从类接待员。

我的想法是逐行读取txt文件,并提取一些行并将它们存储在ArrayList中。我可以即时打印出价值。 然而,数组列表变为空如果我从TestClass中调用它。

您的回答将不胜感激!

Output: 
Tonny Bob 
Mike tyson 
The size is: 0 


txt file: 
    Tonny,Bob,abc,abc,D 
    Mike,tyson,abc,abc,D 
    Laura,jack,abc,abc,P 
    Jimmy,viva,abc,abc,P 

public class TestClass { 
    public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{ 
     Receptionist obj = new Receptionist(); 
     obj.DisplayDoctorList(); 
     System.out.println("The size is: " + obj.doctorlist.size()); 
    } 

} 

public class Base { 
    String pathusers = "/Users/MacTonish/users.txt"; 
    ArrayList<String> doctorlist = new ArrayList<String>(); 

    public void readLines(Object instance, String path, Method method) 
      throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { 
     try { 
      File txt = new File(path); 
      BufferedReader reader = new BufferedReader(new FileReader(txt)); 
      String readLine = null; 
      while ((readLine = reader.readLine()) != null) { 
       method.invoke(instance, readLine); //something is fishy here. 
      } 
      reader.close(); 
     } catch (

     IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

class Receptionist extends Base { 

    public void DisplayDoctorList() throws NoSuchMethodException, SecurityException, IllegalAccessException, 
      IllegalArgumentException, InvocationTargetException { 
     Method method = Receptionist.class.getMethod("ReadDoctorList", String.class); 
     readLines(new Receptionist(), pathusers, method); 
    } 

    public void ReadDoctorList(String readLine) { 
     String[] token = readLine.split(","); 
     if (token[4].equals("D")) { 
      doctorlist.add(token[0] + " " + token[1]); 
      System.out.println(token[0] + " " + token[1]); //Print out is ok. 
     } 

    } 
} 

回答

2

如果您更改您的接待员的代码下面,它应该工作

//readLines(new Receptionist(), pathusers, method); 

    //Here you are creating a new object but while printing you are using last created Object of ReceptionList 


变更线的上面的代码

readLines(this, pathusers, method); 
相关问题