JAVA(1)-单例-动态创建ClassLoad.loadClass,Class.forName
1.单例
2.config 自配置:ClassLoad.loadClass,Class.forName
1.单例
//1.定义 内存中始终只有一个实例,一般就是一个exe
public static final testFrame INSTANCE = new testFrame();
//2.调用 直接调用里面的函数
testFrame.INSTANCE.fun1(new object1(hx, hy, dir, group));
2.配置
从config文件中读取类名,动态生成需要的类。需要新的类的时候,只要改config的配置文件而不需要改代码。
2.1.添加配置文件 :一般有txt,xml,yml等格式,内容为key-value
#key-value
#xml yml 无空格,均为字符串
#1.变量 此为字符串
initTankCount=5
#2.类名 单个类名
#比如Strategy有 Strategy1 Strategy2 Strategy3 那么用哪个就在等号后写哪个
Strategy=DefaultFireStrategy
#3.list 容器类 里面有多个,一次load到内存中
colliders=Collider1,Collider2,Collider3
2.2读取配置文件信息 Properties类
//1.读取配置文件 用的是Properties
//2.为了方便写了一个类
public class PropertyMgr {
private static Properties props;
static {
try {
props=new Properties();
props.load(PropertyMgr.class.getClassLoader().getResourceAsStream("config"));
} catch (IOException e) {
e.printStackTrace();
}
}
public static String get(String key)
{
return (String )props.get(key);
}
}
得到配置文件中的字符串:
String className=PropertyMgr.get("Strategy"); 得到的就是上面配置文件中名为Strategy后面对应的字符。
2.3创建类
两种方法 包的路径为全路径
方法1:ClassLoad.loadClass
//就下面两句话,路径为全路径,
//Class clazz = loader.loadClass("com.test.strategy."+className);
//strategy=(FireStrategy)(clazz.getDeclaredConstructor().newInstance());
private FireStrategy strategy=null;
private void initFireStrategy()
{
ClassLoader loader=Player.class.getClassLoader();
String className=PropertyMgr.get("Strategy");
try {
Class clazz = loader.loadClass("com.test.strategy."+className);
strategy=(FireStrategy)(clazz.getDeclaredConstructor().newInstance());
} catch (Exception e)
{
e.printStackTrace();
}
}
方法2:Class.forName 以读取容器内容为例
//下面两句话
//Class clazz=Class.forName("com.test.chainofresponsibility."+name);
//Collider c =(Collider)(clazz.getConstructor().newInstance());
colliders = new ArrayList<>();
String[] ColliderNames= PropertyMgr.get("colliders").split(",");
try {
for(String name:ColliderNames)
{
Class clazz=Class.forName("com.test.chainofresponsibility."+name);
Collider c =(Collider)(clazz.getConstructor().newInstance());
colliders.add(c);
}
} catch (Exception e) {
e.printStackTrace();
}

浙公网安备 33010602011771号