2012-07-23 71 views
-1

我需要有关Java反射的帮助。基于附加的代码,我不确定如何在buildPersonDynamically方法中动态返回类对象的ArrayList。逻辑与buildPerson方法类似。请参阅MyMain.java。在Java反射中动态返回ArrayList对象

package reflection; 

import java.lang.reflect.Field; 
import java.lang.reflect.Method; 
import java.util.ArrayList; 
import reflection.builder.PersonBuilder; 
import reflection.one.two.three.Person; 

public class MyMain { 
public static void main(String[] args) {     
    buildPerson(3); 
    buildPersonDynamically(3); 
} 
static void buildPerson(int total) { 
    PersonBuilder pb = new PersonBuilder(); 

    pb.build(3); 
    ArrayList<Person> per = pb.getDataSet(); 
    System.out.println(per.get(1).FirstName); 
} 
static void buildPersonDynamically(int total) { 
    try { 
     Class<?> c = java.lang.Class.forName("reflection.builder.PersonBuilder"); 
     Object obj = c.newInstance();    

     Class<Integer> partypes = Integer.TYPE; 
     Method m1 = c.getMethod("build", partypes); 
     m1.invoke(obj, total); 

     Method m2 = c.getMethod("getFirstName", partypes); 
     Object objStr = m2.invoke(obj, 2); 
     System.out.println(objStr.toString()); // success 

     Method m3 = c.getMethod("getDataSet"); 

     // Not sure how to get an ArrayList of Person dataSet dynamically. 
     // Example, want to get the FirstName from the m3. 

    } 
    catch (Throwable e) { 
     System.err.println(e); 
    } 
} 
} 



package reflection.builder; 
import java.util.ArrayList; 
import reflection.one.two.three.Person; 

public class PersonBuilder { 
private ArrayList<Person> dataSet; 

public ArrayList<Person> getDataSet() { 
    return dataSet; 
} 

public ArrayList<Person> build(int numberOfRecords) { 
    ArrayList<String> firstName = new ArrayList<String>(); 
    ArrayList<String> lastName = new ArrayList<String>(); 
    ArrayList<Integer> age = new ArrayList<Integer>(); 
    ArrayList<String> emailAddress = new ArrayList<String>(); 

    Person per; 

    this.dataSet = new ArrayList<Person>(); 

    firstName.add("Barrack"); 
    firstName.add("John"); 
    firstName.add("Whitney"); 
    firstName.add("Paris"); 
    firstName.add("Britney"); 

    lastName.add("Obama"); 
    lastName.add("Lennon"); 
    lastName.add("Houston"); 
    lastName.add("Hilton"); 
    lastName.add("Spears"); 

    age.add(47); 
    age.add(60); 
    age.add(48); 
    age.add(32); 
    age.add(25); 

    emailAddress.add("[email protected]"); 
    emailAddress.add("[email protected]"); 
    emailAddress.add("[email protected]"); 
    emailAddress.add("[email protected]"); 
    emailAddress.add("[email protected]"); 

    if (numberOfRecords >= 5) numberOfRecords = 5; 
    for (int i=0; i < numberOfRecords; i++) { 
     per = new Person(); 
     per.FirstName = firstName.get(i); 
     per.LastName = lastName.get(i); 
     per.Age = age.get(i); 
     per.EmailAddress = emailAddress.get(i); 

     this.dataSet.add(per); 
    } 
    return this.dataSet; 
} 

public String getFirstName(int a) { 
    return this.dataSet.get(a).FirstName; 
} 
} 


package reflection.one.two.three; 

public class Person { 
public String FirstName; 
public String LastName; 
public int Age; 
public String EmailAddress; 
} 

回答

1

如果您确定生成了ArrayList,您可以将其施放。

Method m3 = c.getMethod("getDataSet"); 
Object resultM3 = m3.invoke(obj); 
ArrayList<Person> resultListM3 = (ArrayList<Person>) resultM3; 
+0

这不会编译。 – assylias 2012-07-23 11:06:32

+0

它应该编译好jdk5或更多,'invoke(obj,obj ...)'接受'varargs'。如果该方法没有任何参数,我们不需要显式传递null。 – 2012-07-23 11:15:12

+0

@ Rp-你是对的,它确实编译了 - 我的错误。 – assylias 2012-07-23 13:03:45

1

这应该工作:

Method m3 = c.getMethod("getDataSet"); 
ArrayList<Person> per = (ArrayList<Person>) m3.invoke(obj, null); 

invoke方法的null说法表示没有参数传递给方法。

+1

我一直忘记这个'null'。 – Nitram 2012-07-23 11:07:31

+0

您在m3.invoke调用中不需要null。事实上,这可能会是模糊不清的,而且通常会产生一个编译错误,因为它不知道null是否应该是单个对象(可变参数语法)参数或Object [],将参数指定为数组。如果你不需要任何参数,你必须要处理(Object [])null。在这种情况下,最好将方法调用关闭。 – Matt 2012-07-23 12:39:41

+0

@Matt 1.它编译。 2.检查[javadoc](http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Method.html#invoke%28java.lang.Object,%20java.lang.Object ...如果底层方法所需的形式参数的数量为0,则提供的args数组的长度可以是0或者空**。* 3.你说得对,完全跳过这个参数是可能更具可读性。 – assylias 2012-07-23 13:01:47