使用反射创建对象

一 实战

1 代码

import java.util.*;
import java.io.*;

public class ObjectPoolFactory
{
   // 定义一个对象池,前面是对象名,后面是实际对象
   private Map objectPool = new HashMap<>();
   // 定义一个创建对象的方法,
   // 该方法只要传入一个字符串类名,程序可以根据该类名生成Java对象
   private Object createObject(String clazzName)
         throws InstantiationException
         , IllegalAccessException , ClassNotFoundException
   {
      // 根据字符串来获取对应的Class对象
      Class clazz = Class.forName(clazzName);
      // 使用clazz对应类的默认构造器创建实例
      return clazz.newInstance();
   }
   // 该方法根据指定文件来初始化对象池,
   // 它会根据配置文件来创建对象
   public void initPool(String fileName)
         throws InstantiationException
         , IllegalAccessException ,ClassNotFoundException
   {
      try(
            FileInputStream fis = new FileInputStream(fileName))
      {
         Properties props = new Properties();
         props.load(fis);
         for (String name : props.stringPropertyNames())
         {
            // 每取出一对key-value对,就根据value创建一个对象
            // 调用createObject()创建对象,并将对象添加到对象池中
            objectPool.put(name ,
                  createObject(props.getProperty(name)));
         }
      }
      catch (IOException ex)
      {
         System.out.println("读取" + fileName + "异常");
      }

   }
   public Object getObject(String name)
   {
      // 从objectPool中取出指定name对应的对象。
      return objectPool.get(name);
   }

   public static void main(String[] args)
         throws Exception
   {
      ObjectPoolFactory pf = new ObjectPoolFactory();
      pf.initPool("obj.txt");
      System.out.println(pf.getObject("a"));      // ①
      System.out.println(pf.getObject("b"));      // ②
   }
}

2 配置文件

a=java.util.Date
b=javax.swing.JFrame

3 运行

E:\Java\疯狂java讲义\codes\18\18.4>java ObjectPoolFactory
Sun Jul 07 14:16:29 CST 2019
javax.swing.JFrame[frame0,0,0,0x0,invalid,hidden,layout=java.awt.BorderLayout,title=,resizable,normal,defaultCloseOperation=HIDE_ON_CLOSE,rootPane=javax.swing.JRootPane[,0,0,0x0,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]

二 实战

1 代码

import java.lang.reflect.*;

public class CreateJFrame
{
   public static void main(String[] args)
         throws Exception
   {
      // 获取JFrame对应的Class对象
      Class jframeClazz = Class.forName("javax.swing.JFrame");
      // 获取JFrame中带一个字符串参数的构造器
      Constructor ctor = jframeClazz
            .getConstructor(String.class);
      // 调用Constructor的newInstance方法创建对象
      Object obj = ctor.newInstance("测试窗口");
      // 输出JFrame对象
      System.out.println(obj);
   }
}

2 运行

javax.swing.JFrame[frame0,0,0,0x0,invalid,hidden,layout=java.awt.BorderLayout,title=测试窗口,resizable,normal,defaultCloseOperation=HIDE_ON_CLOSE,rootPane=javax.swing.JRootPane[,0,0,0x0,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]

 

你可能感兴趣的:(java)