Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何重写我在反射中收到的类的方法(没有接口实现):_Java_Android_Reflection_Overriding_Webviewclient - Fatal编程技术网

Java 如何重写我在反射中收到的类的方法(没有接口实现):

Java 如何重写我在反射中收到的类的方法(没有接口实现):,java,android,reflection,overriding,webviewclient,Java,Android,Reflection,Overriding,Webviewclient,我正在写一个SDK。在这个SDK的某些逻辑中,我需要识别屏幕上的WebView,将WebViewClient附加到它,并使用它的方法,如: wv.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String urlNewString) { if(!loadingFinished) { redirect = t

我正在写一个SDK。在这个SDK的某些逻辑中,我需要识别屏幕上的
WebView
,将
WebViewClient
附加到它,并使用它的方法,如:

wv.setWebViewClient(new WebViewClient() {
  @Override
  public boolean shouldOverrideUrlLoading(WebView view, String urlNewString) {
     if(!loadingFinished) {
       redirect = true;
     }
     if(isCaptureMode()) {
       wv.setAlpha(0.1f);
     }

     loadingFinished = false;
     view.loadUrl(urlNewString);
         return true;
  }

  @Override
  public void onPageStarted(WebView view, String url, Bitmap facIcon) {
    loadingFinished = false;
    ABLogger.d("onWebViewDetected() onPageStarted");
  }

  @Override
  public void onPageFinished(WebView view, String url) {
      if (!redirect) {
          loadingFinished = true;
      }

      if (loadingFinished && !redirect) {
         ABLogger.d("onWebViewDetected() onPageFinished");
                        onWebViewLoaded(view, true);
       } else {
           redirect = false;
       }
  }

  @Override
  public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
    super.onReceivedError(view, request, error);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
       ABLogger.e("Failed to load site with url '%s'. error: %s", view.getUrl(), error.getDescription());
    } else {
      ABLogger.e("Failed to load site with url '%s'. error: %s", view.getUrl(), error.toString());
    }
    onWebViewLoaded(view, false);
  }
});
在其他一些情况下,我处理的是Cordova应用程序,在这种情况下,我收到的是
SystemWebView
视图,而不是
WebView
视图。在这种情况下,
SystemWebView
希望在
setWebViewClient
方法中获得一个
SystemWebViewClient
类。现在我的SDK中没有Cordova类。所以我用反射来做这一切:

private Class getCordovaSystemWebViewClient() {
    if (mSystemWebViewClient == null) {
        try {
            this.mSystemWebViewClient = Class.forName(MapperBase.KEY_VIEW_CORDOVA_SYSTEM_WEB_VIEW_CLIENT);
        } catch (Exception e) {
            return null;
        }
    }
    return mSystemWebViewClient;
}
....

Class classCordovaSystemWebViewClient = getCordovaSystemWebViewClient();
Constructor constructor = classCordovaSystemWebViewClient.getConstructors()[0];
Object webViewClient = null;
Object o = constructor.newInstance(null);
问题:既然我有了
SystemWebViewClient
类实例,我如何重写它的方法?就像我使用常规的
WebViewClient

有没有一种方法可以做到:

Object o = constructor.newInstance(null) {
    //provide an implementation for cetain methods.
};

或者只是替换类中某些方法的实现?

不确定是否有帮助,但这听起来像是一个
代理
会很有用。有关用法,请参阅。@OldCurmudgeon,如果WebViewClient实现了某种接口,您是对的,但它没有:因此,我认为在这种情况下不能使用“代理”,我不确定它是否有用,但这听起来像是一个
代理
。有关用法,请参阅。@OldCurmudgeon,如果WebViewClient实现了某种接口,您是对的,但它没有:因此我认为在这种情况下不能使用“代理”