Java 如何重写我在反射中收到的类的方法(没有接口实现):
我正在写一个SDK。在这个SDK的某些逻辑中,我需要识别屏幕上的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
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实现了某种接口,您是对的,但它没有:因此我认为在这种情况下不能使用“代理”