通過反射建立物件(有引數和無引數構造方法)
阿新 • • 發佈:2019-01-09
1、建立一個實體類
package adtec.reflect; public class Person { String name; public String getName() { return name; } public void setName(String name) { this.name = name; } //根據屬性來定義的構造方法 public Person(String name) { super(); this.name = name; } //無參構造方法 public Person(){ } public void run(){ System.out.println(getName() + " is running"); } public void eat(){ System.out.println(getName() + " is eating rice"); } }
2、根據定義的類例項化
package adtec.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import org.junit.Test; public class ReflectPerson { /** * 根據字串反射,無引數的構造方法 */ @Test public void noParamContruct(){ String classStr = "adtec.reflect.Person"; ClassLoader c1 = ClassLoader.getSystemClassLoader(); Class clazz; try { clazz = c1.loadClass(classStr); Person person = (Person)clazz.newInstance(); person.eat(); person.run(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } /** * 根據字串反射,有引數的構造方法 */ @Test public void haveParamContruct(){ String classStr = "adtec.reflect.Person"; ClassLoader c1 = ClassLoader.getSystemClassLoader(); try { Class clazz = c1.loadClass(classStr); Constructor construct = clazz.getConstructor(String.class); Person person = (Person)construct.newInstance("huangbiao"); person.eat(); person.run(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } /** * 使用Class類來根據字串載入物件 */ @Test public void newObjectByClass(){ String classStr = "adtec.reflect.Person"; try { Person person = (Person)Class.forName(classStr).newInstance(); person.eat(); person.run(); } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }