Как динамически вызывать и устанавливать и получать методы, используя класс Reflection? - PullRequest
0 голосов
/ 23 мая 2018

Скажем, у меня есть класс AccountPojo и GetAccountPojo с его методами установки и получения, как показано ниже.

public class AccountPojo {

    private String dataList;
    private String dataSet;

    public String getDataList() {
        return dataList;
    }

    public void setDataList(String dataList) {
        this.dataList = dataList;
    }

    public String getDataSet() {
        return dataSet;
    }

    public void setDataSet(String dataSet) {
        this.dataSet = dataSet;
    }
} 

public class GetAccountsPojo {

    private String accountId;
    private int noOfAccounts;

    public String getAccountId() {
        return accountId;
    }

    public void setAccountId(String accountId) {
        this.accountId = accountId;
    }

    public int getNoOfAccounts() {
        return noOfAccounts;
    }

    public void setNoOfAccounts(int noOfAccounts) {
        this.noOfAccounts = noOfAccounts;
    }
}

Теперь у меня есть класс Test, как показано ниже

public Class Test {

    public static void main(String[] args) {

        Class cls = Class.forName("com.org.temp."+ClassName); // ClassName(AccountPojo/GetAccountPojo) here I know already which class is getting called.

        Object clsInstance = (Object) cls.newInstance();

        System.out.println("The cls is==" + cls+" and classInstance is=="+clsInstance);

    // Here I want to access getter and setter methods of AccountPojo and GetAcoountPojo dynamically, no hard coding

    }   
}

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Вы пытались получить все методы вызванного класса и отфильтровать только методы получения по имени и вызвать их?

 Method[] methods =  cls.getDeclaredMethods();

             for (Method m: methods) {
                 if(m.getName().startsWith("get")) {
                     m.invoke(clsInstance);
                 }
             }

Это решает нашу половинную проблему, так как геттеры вызываются без каких-либо аргументов.Но если вам нужно вызвать метод установки, вам нужно указать аргументы.Например, чтобы вызвать установщик, который принимает метод строкового аргумента, как показано ниже:

m.invoke(clsInstance, "some string argument");

Одним из решений может быть то, что все установщики принимают значение типа объекта и типизируют его при назначении его фактическим переменным класса.

Теперь ваши классы pojo будут выглядеть следующим образом:

public class AccountPojo {

private String dataList;
private String dataSet;

public String getDataList() {
    return dataList;
}

public void setDataList(Object dataList) {
    this.dataList = (String) dataList;
}

public String getDataSet() {
    return dataSet;
}

public void setDataSet(Object dataSet) {
    this.dataSet = (String)dataSet;
}
} 

public class GetAccountsPojo {

private String accountId;
private int noOfAccounts;

public String getAccountId() {
    return accountId;
}

public void setAccountId(Object accountId) {
    this.accountId = (String) accountId;
}

public int getNoOfAccounts() {
    return noOfAccounts;
}

public void setNoOfAccounts(Object noOfAccounts) {
    this.noOfAccounts = (int) noOfAccounts;
}
}

Добавьте приведенный ниже код к основному методу:

for (Method m: methods) {
  if(m.getName().startsWith("get")) {
    m.invoke(clsInstance);
  }
  if(m.getName().startsWith("set")) {
    m.invoke(clsInstance, "any argument to be passed here");
  }

}
0 голосов
/ 23 мая 2018

Не используйте сырой класс.Если вы знаете, какой класс уже вызван, используйте типизированный класс.

    try {
        AccountPojo obj = AccountPojo.class.newInstance();
        Method setDataList = AccountPojo.class.getMethod("setDataList");
        setDataList.setAccessible(true); // This is important if you want to access protected or private method. For public method you can skip
        setDataList.invoke(obj, "123");
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...