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();
        }





 

你可能感兴趣的:(JAVA)