欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android 实例化插件

程序员文章站 2022-05-23 17:36:42
...

在进行SDK开发中,往往使用到插件进行功能调用,想调用插件则需要对插件进行实例化,其思路是:根据插件所在的绝对路径通过Class.forName方法获取Class对象,利用所获取的Class对象调用getDeclaredConstructor方法获取其Constructor对象,最后对所得到的Constructor对象newInstance进行实例化,以上步骤最后得到的就是插件实例。

具体实现如下:

实例化工具类

public class PlugFactory {

    private final static String TAG = PlugFactory.class.getSimpleName();

    /**
     * 实例化插件(有参构造函数:参数传入Context)
     */
    public static Object newPlugin(String pluginName, Context context) {

        try {
            Class clazz = Class.forName(pluginName);
            if(clazz!=null) {
                Constructor constructor = clazz.getDeclaredConstructor(new Class[]{
                        Context.class
                });
                return constructor.newInstance(new Object[]{
                        context
                });
            }
        } catch (Exception ex) {
            try {
                if(pluginName!=null) {
                    return newPluginNoParam(pluginName);
                }
            } catch (Exception ex2) {
                Log.e(TAG,"newPlugin:fail to new Plugin", pluginName);
            }
        }
        return null;
    }

    /**
     * 实例化插件(无参构造函数)
     */
    public static Object newPluginNoParam(String pluginName){
        try {
            Class clazz = Class.forName(pluginName);
            if(clazz!=null) {
                Constructor constructor = clazz.getDeclaredConstructor(new Class[]{});
                return constructor.newInstance(new Object[]{});
            }
        } catch (Exception ex) {
            Log.e(TAG,"newPluginNoParam:fail to new Plugin", pluginName);
        }
        return null;
    }
}

插件类

public class StudentPlug {

    private final static String TAG = StudentPlug.class.getSimpleName();

    //无参构造函数
    public StudentPlug() { }

    //有参构造函数:参数传入Context
    public StudentPlug(Context context) { }
    
    //定义方法
    public void learn(){
        Log.d(TAG,"learn...");
    }
}

实例化插件

假设插件所在的绝对路径是:com.test.demo.StudentPlug

调用实例化工具类:PlugFactory.newPlugin("com.test.demo.StudentPlug",context);

注:在实例化插件时,如果插件是有参构造函数则会在实例化工具类的有参实例化方法中成功创建,否则会在无参实例化方法中成功创建,同时,所传的参数类型视插件中的参数类型为例,保持和插件中所传的参数类型一致,否则将实例化失败。