使用反射调用方法后,为什么ArrayList中的值消失了?

时间:2017-04-02 03:15:29

标签: java arraylist

我有两个班级:

  1. 子类:接待员类有两个方法ReadDoctorList(String readLine)和DisplayDoctorList()。

  2. 父类:带有readLine方法的基础类,我将方法作为参数传递,该方法来自班级接待员。

  3. 我的想法是逐行读取txt文件并提取一些行并将它们存储在ArrayList中。我可以随时打印出值。 但是,如果我从TestClass中调用它,那么arraylist就会变空。

    非常感谢您的回答!

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

1 个答案:

答案 0 :(得分: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);