Java 由于未找到构造函数,从类对象动态实例化AsyncTask失败

Java 由于未找到构造函数,从类对象动态实例化AsyncTask失败,java,android,Java,Android,我有一些事情需要在应用程序启动过程中异步完成。我创建了一个从AsyncTask派生的抽象类,它实现了这些加载任务的共同点: protected abstract class LoadTask extends AsyncTask<Object, Void, Object>{ MainActivity activity; void detach(){ activity = null; } void attach(MainActivity a

我有一些事情需要在应用程序启动过程中异步完成。我创建了一个从AsyncTask派生的抽象类,它实现了这些加载任务的共同点:

protected abstract class LoadTask extends AsyncTask<Object, Void, Object>{
    MainActivity activity;
    void detach(){
        activity = null;
    }
    void attach(MainActivity a){
        activity = a;
    }

    public LoadTask(MainActivity a){
        super();
        attach(a);
    }

    public abstract boolean shouldRun();

    @Override
    protected void onPostExecute(Object result){
        activity.onFinishLoad(this.getClass(), result);
    }
}
下面是从我的活动的onCreate()方法中调用这些函数的代码:

Log.v(TAG, c.getName());
Class[] types = {MainActivity.class};
Constructor construct = c.getConstructor(types);
task = (LoadTask)(construct.newInstance(this));
下面是日志:

12-17 10:26:25.750: V/MainActivity(25188): com.mycompany.mypackage.MainActivity$ItemInfoLoadTask
12-17 10:26:25.760: E/MainActivity(25188): this shouldn't happen
12-17 10:26:25.760: E/MainActivity(25188): java.lang.NoSuchMethodException: <init> [class com.mycompany.mypackage.MainActivity]
12-17 10:26:25.760: E/MainActivity(25188):        at java.lang.ClassMembers.getConstructorOrMethod(ClassMembers.java:235)
12-17 10:26:25.760: E/MainActivity(25188):        at java.lang.Class.getConstructor(Class.java:459)
12-17 10:26:25.760: E/MainActivity(25188):        at com.mycompany.mypackage.MainActivity.onCreate(MainActivity.java:80)
12-17 10:26:25.760: E/MainActivity(25188):        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
12-17 10:26:25.760: E/MainActivity(25188):        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1715)
12-17 10:26:25.760: E/MainActivity(25188):        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1767)
12-17 10:26:25.760: E/MainActivity(25188):        at android.app.ActivityThread.access$1500(ActivityThread.java:122)
12-17 10:26:25.760: E/MainActivity(25188):        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1005)
12-17 10:26:25.760: E/MainActivity(25188):        at android.os.Handler.dispatchMessage(Handler.java:99)
12-17 10:26:25.760: E/MainActivity(25188):        at android.os.Looper.loop(Looper.java:132)
12-17 10:26:25.760: E/MainActivity(25188):        at android.app.ActivityThread.main(ActivityThread.java:4028)
12-17 10:26:25.760: E/MainActivity(25188):        at java.lang.reflect.Method.invokeNative(Native Method)
12-17 10:26:25.760: E/MainActivity(25188):        at java.lang.reflect.Method.invoke(Method.java:491)
12-17 10:26:25.760: E/MainActivity(25188):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
12-17 10:26:25.760: E/MainActivity(25188):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
12-17 10:26:25.760: E/MainActivity(25188):        at dalvik.system.NativeStart.main(Native Method)
12-17 10:26:25.750:V/MainActivity(25188):com.mycompany.mypackage.MainActivity$ItemInfoLoadTask
12-17 10:26:25.760:E/main活动(25188):这不应该发生
12-17 10:26:25.760:E/MainActivity(25188):java.lang.NoSuchMethodException:[class com.mycompany.mypackage.MainActivity]
12-17 10:26:25.760:E/MainActivity(25188):at java.lang.ClassMembers.getConstructorOrMethod(ClassMembers.java:235)
12-17 10:26:25.760:E/MainActivity(25188):位于java.lang.Class.getConstructor(Class.java:459)
12-17 10:26:25.760:E/MainActivity(25188):位于com.mycompany.mypackage.MainActivity.onCreate(MainActivity.java:80)
12-17 10:26:25.760:E/MainActivity(25188):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
12-17 10:26:25.760:E/MainActivity(25188):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1715)
12-17 10:26:25.760:E/MainActivity(25188):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1767)
12-17 10:26:25.760:E/MainActivity(25188):在android.app.ActivityThread.access$1500(ActivityThread.java:122)
12-17 10:26:25.760:E/MainActivity(25188):在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1005)
12-17 10:26:25.760:E/MainActivity(25188):在android.os.Handler.dispatchMessage(Handler.java:99)上
12-17 10:26:25.760:E/main活动(25188):在android.os.Looper.loop(Looper.java:132)
12-17 10:26:25.760:E/MainActivity(25188):位于android.app.ActivityThread.main(ActivityThread.java:4028)
12-17 10:26:25.760:E/MainActivity(25188):位于java.lang.reflect.Method.Invokenactive(本机方法)
12-17 10:26:25.760:E/MainActivity(25188):位于java.lang.reflect.Method.invoke(Method.java:491)
12-17 10:26:25.760:E/MainActivity(25188):位于com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
12-17 10:26:25.760:E/main活动(25188):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
12-17 10:26:25.760:E/main活动(25188):在dalvik.system.NativeStart.main(本地方法)

我不知道我做错了什么。如果有什么关系(尽管我不明白为什么会这样),LoadTask和ItemInfoLoadTask是MainActivity中的内部类

非静态内部类包含对封闭类实例的隐式引用。此类内部类的所有构造函数都引用封闭类的实例作为参数

一个简单的例子:

import java.lang.reflect.*;

class Foo {
    class Bar {
        public Bar(int a) {
        }
    }

    public static void main(String[] args) {
        for(Constructor c: Bar.class.getDeclaredConstructors()) {
            System.out.println(c);
        }   
    }
}
打印
public Foo$Bar(Foo,int)
-注意第一个
Foo
参数。 该工具可以显示有关
Foo$Bar.class
的结构声明字段、方法和构造函数的信息:

Compiled from "Foo.java"
class Foo$Bar extends java.lang.Object{
    final Foo this$0;
    public Foo$Bar(Foo, int);
}
在这里,您可以看到对父对象的隐式引用。JVM不知道内部类,因此编译器必须引入合成方法和字段来实现所需的行为。在你需要像反射这样的东西之前,它通常不会被注意到


在您的特定情况下,您可以将内部类设置为静态,这样就不会有隐式引用,也可以删除对
MainActivity

的显式引用。事实上,这就是问题所在。我不知道,正如我所说的“我不明白为什么它应该[重要的是它是一个内部类]”,内部类是这样工作的。我猜这有点像python的“self”参数,隐式地传递给类方法。
Compiled from "Foo.java"
class Foo$Bar extends java.lang.Object{
    final Foo this$0;
    public Foo$Bar(Foo, int);
}