反射创建对象

第一步

将对象的路径存到properties属性集文件中
反射创建对象
为了方便,建议创建一个新文件夹
反射创建对象
由于resource和src是同级目录,所以resouce目录下的文件会自动更新到classpath(bin目录)路径下面。我们看看效果
反射创建对象

第二步:反射创建对象

package wuziqi;

import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
import java.util.Properties;

public class PlayGame {
	/*
	public static void main(String[] args) {//正常创建对象,硬编码
		Game game=new Game();
		game.playgame();
	}*/
	private static Properties p=new Properties();
	static {//静态代码块不能抛出异常
		/*
		 * 从classpath,也就是bin目录,加载资源文件。
		 */
		try {
		ClassLoader loader=PlayGame.class.getClassLoader();
		//从用来加载类的搜索路径(classpanth路径)打开具有指定名称的资源,以读取该资源。
		InputStream in=loader.getResourceAsStream("plugins.properties");
			p.load(in);//从流里读取数据
			System.out.println(p);
			Collection<Object> value=p.values();//从属性集中拿到所有value值
			for (Object object : value) {
				String classname=(String) object;
				//System.out.println(classname);
				try {
					Class<?> clz=Class.forName(classname);//加载class字节码
					Game game=(Game) clz.newInstance();//创建对象
					game.playgame();//执行对象的方法
				} catch (ClassNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (InstantiationException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}		
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

第三步:运行PlayGame类;

反射创建对象

可以看出效果和硬编码new创建对象是一个效果。