0

我有一个 Activity Class Anmeldung、一个普通的 java 类thread_haupt.class和一个 Activity funktionen_haupt.class。

on Start of Anmeldung.class启动threads_haupt.class的函数(funktionstarter)这通过invoke 从functionen_haupt.class调用一个函数。

这个想法是有一个可以从其他类启动其他函数的函数 问题是java.lang.InstantiationException: can't instantiate class ...当我尝试 newInstance() 时,我的 thread_haupt.class 中没有空构造函数(见下文thread_haupt.class) java.lang.InstantiationException: 无法实例化类...没有空的构造函数

Anmeldung 类

public class anmeldung extends Activity implements OnClickListener{
@Override
    protected void onStart() { // start ist dann aufgerufen wenn alles gebaut ist
        // TODO Auto-generated method stub
        meine_funktionen.buttons_vorbereiten(this);

        /**
         * hier wirde zuerst der spinner befüllt
         */
        thread_haupt meinThread = new thread_haupt();
        //HOMEPAGE,naj.nuz.wz.wa.dc.kommunikation.allgemein kommunikation,naj.nuz.wz.wa.dc.drinkcoffee.helfer.allgemein helfer, Activity meineAct};
        meinThread.meine_parameter= new  Object[] {HOMEPAGE,kommunikation,helfer,meineAct};
        meinThread.meine_funktion="staedte_abfragen";
        meinThread.mein_context=this.getApplicationContext();
        meinThread.meine_activity=this;
        meinThread.thread_starten("staedte_abfragen"); // HERE !!!

线程类

public class thread_haupt {

    public Object[] meine_parameter;
    public String meine_funktion;
    public Object mein_context;
    public Activity meine_activity;
    public allgemein mein_helfer = new allgemein();
    public funktionen_haupt meine_funktionen = new funktionen_haupt((Context) mein_context, meine_activity);

    /**
     * hier sollen die threads gestartet werden
     * @param threadName
     */
    public void thread_starten(String threadName){
        switch (threadName) {
        case "staedte_abfragen":
            //Thread thread = new Thread(new Runnable(){
                //hier hab ich das gefunden http://stackoverflow.com/questions/5161951/android-only-the-original-thread-that-created-a-view-hierarchy-can-touch-its-vi
                //public void run() {
                    //meine_funktionen.staedte_abfragen(HOMEPAGE,kommunikation,helfer, meineAct);
                    try {
                        meine_funktionen.funktionstarter("naj.nuz.wz.wa.dc.drinkcoffee.funktionen_haupt", meine_funktion, meine_parameter, mein_context);
                        // hier aufgehört dies startet nicht
                    } catch (NoSuchMethodException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IllegalArgumentException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (InvocationTargetException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (InstantiationException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                //}
            //});
            //thread.start();
            break;

        default:
            break;
        }
    }


}

funktionen_haupt.class

public class funktionen_haupt extends Activity  {

    // CONTEXT empfangen von den die die klasse aufrufen
    Context mContext;
    Activity mActivity;

    allgemein kommunikation = new allgemein();
    naj.nuz.wz.wa.dc.drinkcoffee.helfer.allgemein helfer = new naj.nuz.wz.wa.dc.drinkcoffee.helfer.allgemein();



    public   funktionen_haupt(Context mContext,Activity mActivity){

        this.mContext = mContext;
        this.mActivity=mActivity;
    }
public void funktionstarter(String package_name,String funktion_name,Object[] arguments, Object meincontext) throws NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, java.lang.InstantiationException {
        //no paramater
        Method[] methoden;
        Class cls = null;
        Object obj = null;
        try {
            cls = Class.forName(package_name);
            obj = cls.newInstance(); // !!! HERE IS MY PROBLEM !!!!
            //Constructor<funktionen> obj = cls.getConstructor(cls);
            //funktionen dieklasse = obj.newInstance(null);

            //Object obj = FactoryRegistry.getFactory(cls).newInstance();




            methoden = cls.getDeclaredMethods();
            for (int i =0;i<=methoden.length-1;i++){
                if (methoden[i].getName().equals(funktion_name)){
                    Method method2 =cls.getDeclaredMethod(funktion_name, methoden[i].getParameterTypes());
                    if (meincontext==null){
                        method2.invoke(obj, arguments);
                    }
                    else{
                        method2.invoke(meincontext, arguments);
                    }

                    break;
                }
            }


        } catch (ClassNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            methoden = cls.getDeclaredMethods();
            for (int i =0;i<=methoden.length-1;i++){
                if (methoden[i].getName().equals(funktion_name)){
                    Method method2 =cls.getDeclaredMethod(funktion_name, methoden[i].getParameterTypes());
                    method2.invoke(this, arguments);
                    break;
                }
            }
        }

    }

我得到一个例外

cls = Class.forName(package_name);
obj = cls.newInstance();  // java.lang.InstantiationException: can't instantiate class … no empty constructor

我不知道为什么。

有人可以告诉我哪里出了问题,为什么它不起作用以及我做错了什么?提前致谢。

4

1 回答 1

0

因为您声明了具有不同参数的构造函数,所以默认(空)构造函数消失了。只有当您没有定义另一个构造函数时,默认构造函数才可用。您可以像这样创建一个空的构造函数:

public   funktionen_haupt(){
}
public   funktionen_haupt(Context mContext,Activity mActivity){
    this.mContext = mContext;
    this.mActivity=mActivity;
}

如果要使用参数创建对象,则不应使用 newInstance() 方法,而只需调用构造函数。

于 2014-04-07T13:06:22.637 回答