java - 反射 java 接口(interface)时收到异常

标签 java reflect

我想在我的一个 SDK 中反射(reflect)一个接口(interface)并调用它,但我收到了一个异常。以下是我的代码。请帮我解决这个问题

public class ReflectMain {
Class<?> obs = null;
InterProxy.ProxyCallback callback = new InterProxy.ProxyCallback() {
    @Override
    public void onInvoke() {
        Log.d("totolog", "invokeSuccess");
    }
};

public void reflectinterMain() {


    try {
        Class<?> reflectClass = Class.forName(ReflectClass.class.getName());
        obs = Class.forName(ReflectClass.ReflectInter.class.getName());
        Method method = reflectClass.getDeclaredMethod("addInter", obs);
        Object listener = Proxy.newProxyInstance(obs.getClassLoader(), new Class[]{obs}, new InterProxy(callback));
        method.setAccessible(true);
        method.invoke("addInter", new Object[]{listener});
        obs.newInstance();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (Exception e){
        e.printStackTrace();
    }
}

class InterProxy implements InvocationHandler {
public ProxyCallback callback = null;
interface ProxyCallback {
    void onInvoke();
}

InterProxy(ProxyCallback callback) {
    if (this.callback != null) {
        this.callback = callback;
    }
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    Log.d("totolog", method.getName());
    if ("onRefletc".equals(method.getName())) {
        callback.onInvoke();
    }

    return proxy;
}

并反射(reflect)类

class ReflectClass {

public ReflectInter inter = null;

void addInter(ReflectInter reflectInter) {
    inter = reflectInter;
    invoInter();
}

interface ReflectInter {
    public void onRefletc();
}

private void invoInter() {
    inter.onRefletc();
}

然后我就收到了这样的异常。请帮我分析一下这个异常的原因以及如何解决。

     Caused by: java.lang.IllegalArgumentException: Expected receiver of type lab.mon.actlab.java.reflectInter.ReflectClass, but got java.lang.String
    at java.lang.reflect.Method.invoke(Native Method)
    at lab.mon.actlab.java.reflectInter.ReflectMain.reflectinterMain(ReflectMain.java:29)
    at lab.mon.actlab.java.reflect.ReflectActivity.onResume(ReflectActivity.java:87)
    at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1354)
    at android.app.Activity.performResume(Activity.java:7079)
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3620)
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3685) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2898) 
    at android.app.ActivityThread.-wrap11(Unknown Source:0) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) 
    at android.os.Handler.dispatchMessage(Handler.java:105) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6541) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 

如何解决这个问题,我想知道为什么?

最佳答案

method.invoke 的调用不正确,因为它期望第一个参数是要调用该方法的对象的实例。您正在传递方法的名称。

关于java - 反射 java 接口(interface)时收到异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54418225/

相关文章:

java - 将新节点插入 AVLTree 后根节点为空

java - 如何创建一个 URL 供 Jsoup 解析?

java - Hibernate选择查询(员工通过电子邮件ID获取或通过姓名获取)

pointers - Go中的通用解码

go - []接口(interface){}的元素类型

Kotlin 反射包并获取所有类

java - 如何将视频文件(例如 mpeg)转换为图像集?

Java:如何访问没有 "getXXX"方法的对象的子对象到该子对象

go - 如何在golang中使用接口(interface)反射的类型断言?

pointers - 如何使用反射读取指向 slice 的指针的值?