Android вызывает функцию через поток в другом классе java.lang.InstantiationException: не может создать экземпляр класса… нет пустого конструктора
У меня есть класс активности Anmeldung, обычный Java-класс thread_haupt.class и класс деятельности funktionen_haupt.class.
при запуске Anmeldung.class запускает функцию (funktionstarter) threads_haupt.class Это вызывает функцию из functionen_haupt.class через invoke.
Идея состоит в том, чтобы иметь функцию, которая может запускать другие функции также из других классов, проблема в том, что java.lang.InstantiationException: не может создать экземпляр класса… нет пустого конструктора в моем thread_haupt.class, когда я пытаюсь newInstance() (см. Ниже в thread_haupt.class) java.lang.InstantiationException: не может создать экземпляр класса… нет пустого конструктора
Anmeldung.Class
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 !!!
threads.class
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://stackru.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
и я не знаю почему.
Может ли кто-то сказать мне, что не так, почему он не работает и что я делаю не так? Заранее спасибо.
1 ответ
Поскольку вы объявили конструктор с другими параметрами, конструктор по умолчанию (пустой) пропал. Конструктор по умолчанию доступен только тогда, когда вы не определили другой конструктор. Вы можете создать пустой конструктор следующим образом:
public funktionen_haupt(){
}
public funktionen_haupt(Context mContext,Activity mActivity){
this.mContext = mContext;
this.mActivity=mActivity;
}
Если вы хотите создать объект с параметрами, вам не следует использовать метод newInstance(), а просто вызвать конструктор.