天天看點

面向接口程式設計:newInstance() 和 new 的差別

通過反射機制加載類驅動和建立類實作:

配置檔案内容<檔案名:properties.properties>:

person=entity.PersonInstanceTest

接口:

package iInterface;

public interface IPerson {

 public void setAge(int age);

 public void setName(String name);

 public void setAddress(String address);

 public int getAge();

 public String getName();

 public String getAddress();

 public String sayHello(String name);

 public String sayGoodBye(String name);

}

接口實作類:

package entity;

import iInterface.IPerson;

public class PersonInstanceTest implements IPerson{

 private int age;

 private String name;

 private String address;

 public PersonInstanceTest() {

  System.out.println("--對象被執行個體化啦!--");

 }

 public PersonInstanceTest(int age,String name,String address){

  this.age = age;

  this.name = name;

  this.address = address;

 }

 @Override

 public int getAge() {

  return 0;

 }

 @Override

 public String getName() {

  return null;

 }

 @Override

 public String getAddress() {

  return null;

 }

 @Override

 public String sayHello(String name) {

  // TODO Auto-generated method stub

  return null;

 }

 @Override

 public String sayGoodBye(String name) {

  return null;

 }

 public void setAge(int age) {

  this.age = age;

 }

 public void setName(String name) {

  this.name = name;

 }

 public void setAddress(String address) {

  this.address = address;

 }

 @Override

 public String toString() {

  return "age: " + age + "  name: " + name + " address: " + address;

 }

}

建立類實作工具類:

package reflect;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.lang.reflect.InvocationTargetException;

import java.util.Properties;

public class ClassReflect {

 private static Properties props;

 //采用靜态語句塊:類加載便會執行

 static{

  props = new Properties();

  try {

   String path = "src" + File.separator + "file" + File.separator + "properties.properties";

   props.load(new FileInputStream(path));

  } catch (FileNotFoundException e) {

   e.printStackTrace();

  } catch (IOException e) {

   e.printStackTrace();

  }

 }

 //調用類無參構造器

 public static Object createInstance(Object className)

    throws ClassNotFoundException, InstantiationException,

     IllegalAccessException, IllegalArgumentException,

     SecurityException, InvocationTargetException,

     NoSuchMethodException{

  String object = (String) props.get(className);

  Class<?> cls = Class.forName(object);

  return cls.getConstructor().newInstance();

 }

 //調用有參構造器

 public static Object createInstance(Object className,Class<?>[] parameterTypes,Object[] initargs) throws Exception{

  String object = (String) props.get(className);

  Class<?> cls =  Class.forName(object);

  return cls.getConstructor(parameterTypes).newInstance(initargs);

 }

}

調用不同參數構造器測試類:

package reflect;

import org.junit.Test;

import iInterface.IPerson;

public class ClassInstanceTest {

 //調用無參構造器

 //@Test

 public void test1(){

  try {

   IPerson person = (IPerson) ClassReflect.createInstance("person");

   person.setName("beyond0851");

   person.setAge(100);

   person.setAddress("hello");

   System.out.println(person.toString());

  } catch (ClassNotFoundException e) {

   e.printStackTrace();

  } catch (Exception e) {

   e.printStackTrace();

  }

 }

 //根據參數類型不同,調用有參構造器

 @Test

 public void test2(){

  try {

   IPerson person = (IPerson) ClassReflect.createInstance("person",

        new Class[]{int.class,String.class,String.class},

         new Object[]{90,"beyond0851","love記記"});

   System.out.println(person.toString());

  } catch (ClassNotFoundException e) {

   e.printStackTrace();

  } catch (Exception e) {

   e.printStackTrace();

  }

 }

}

繼續閱讀