一、动态实例化类
使用反射机制动态实例化类。下面函数是获取参数,实例化之后储存在Map里
public static void dynamicConstruct(Map classList, Object targetClass, DataInput data){
try {
//构造函数参数类型
Class<?>[] param = {DataInput.class};
//构造函数参数值
Object[] value = {data};
//构造有两个参数的构造函数
Constructor<?> constructor = targetClass.getClass().getDeclaredConstructor(param);
//根据构造函数,传入值生成实例
//Map 的Key 一律是 DataInput.target_id
classList.put(data.getTargetID(), constructor.newInstance(value));
} catch
调用办法:下面函数是从Map里根据key获得对象。注意,使用上述函数时传入的Object类型要是 new Aircraft(),直接Aircraft.class会出错
DynamicInstantiate.dynamicConstruct(MAP_var.GroupMAP, new Aircraft(),data);
从MAP里调用动态实例化对象时候,由于MAP里存储的时Object类型的实例化对象,使用类型转换即可转换为原始的类型。
//强制类型转换 Object -> Aircraft
Aircraft later = (Aircraft)MAP_var.GroupMAP.get(data.getTargetID());
二、invoke动态调用方法
如果方法的修饰符为protected 使用getDeclaredMethod 方法,为 public 请用 getMethod 方法。
public Object invoke(Object obj, Object... args) 该函数可以传入方法体所需要的参数
public static <T> T getOtherClassData(String TargetID, String Method) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
//获取动态方法创建的对象
Object tmpClass = TargetClassification.MAP_var.map_individualTarget.get(TargetID);
//调用Class类的方法getMethod获取指定的方法Invoke
Method method = tmpClass.getClass().getMethod(Method);
//运行testInvoke方法,并且返回值
return (T) method.invoke(tmpClass);
}