定义接口Module:
package union.com.viewgroup.utils.parser;
/*
* @Auther xiaobo
* @Date 2019/8/16 15:32
* @Version 1.0
* @Desc 接口
*/
public interface Module {
void println();
}
创建 CustomerMoudule 实现 Module接口:
public class CustomerMoudule implements Module{
public void println(){
Log.i("grage","println");
}
}
ManifestParser实现:
package union.com.viewgroup.utils.parser;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
/*
* @Auther xiaobo
* @Date 2019/8/16 15:14
* @Version 1.0
* @Desc 清单文件解析类
*/
public class ManifestParser {
private static final String TAG = "ManifestParser";
private static final String VALUE = "CustomerModel";
private final Context context;
public ManifestParser(Context context) {
this.context = context;
}
public List<Module> parse() {
List<Module> data = new ArrayList<>();
try {
ApplicationInfo appInfo = context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
if (appInfo.metaData == null) {
return data;
}
for (String key : appInfo.metaData.keySet()) {
if (VALUE.equals(appInfo.metaData.get(key))) {
data.add(parseModule(key));
}
}
} catch (PackageManager.NameNotFoundException e) {
throw new RuntimeException("Unable to find metadata to parse value", e);
}
return data;
}
@SuppressWarnings("deprecation")
private static Module parseModule(String className) {
Class<?> clazz;
try {
clazz = Class.forName(className);
} catch (ClassNotFoundException e) {
throw new IllegalArgumentException("Unable to find Module implementation", e);
}
Object module = null;
try {
module = clazz.getDeclaredConstructor().newInstance();
// These can't be combined until API minimum is 19.
} catch (InstantiationException e) {
throwInstantiateGlideModuleException(clazz, e);
} catch (IllegalAccessException e) {
throwInstantiateGlideModuleException(clazz, e);
} catch (NoSuchMethodException e) {
throwInstantiateGlideModuleException(clazz, e);
} catch (InvocationTargetException e) {
throwInstantiateGlideModuleException(clazz, e);
}
if (!(module instanceof Module)) {
throw new RuntimeException("Expected instanceof Module, but found: " + module);
}
return (Module) module;
}
private static void throwInstantiateGlideModuleException(Class<?> clazz, Exception e) {
throw new RuntimeException("Unable to instantiate Module implementation for " + clazz, e);
}
}