super中需要throws向外抛出异常
在继承org.apache.http.conn.ssl.SSLSocketFactory类时引发的问题
C#代码是这样的
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using AndroidPay.Droid.WeChat.InterfaceImpl;
using Java.Net;
using Java.Security;
using Javax.Net.Ssl;
using Org.Apache.Http.Conn.Schemes;
using Org.Apache.Http.Params;
using MySSLSocketFactory = Org.Apache.Http.Conn.Ssl.SSLSocketFactory;
namespace AndroidPay.Droid.WeChat
{
public class SSLSocketFactoryEx : MySSLSocketFactory
{
SSLContext sslContext = SSLContext.GetInstance("TLS");
public SSLSocketFactoryEx(KeyStore truststore) : base(truststore)
{
var tm = new X509TrustManager();
sslContext.Init(null, new X509TrustManager[] { tm }, new SecureRandom());
//HttpsURLConnection.DefaultSSLSocketFactory = sslContext.SocketFactory;
//HttpsURLConnection.DefaultHostnameVerifier = new HostnameVerifier();
}
protected SSLSocketFactoryEx(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
{
}
public SSLSocketFactoryEx(string algorithm, KeyStore keystore, string keystorePassword, KeyStore truststore, SecureRandom random, IHostNameResolver nameResolver) : base(algorithm, keystore, keystorePassword, truststore, random, nameResolver)
{
}
public SSLSocketFactoryEx(KeyStore keystore, string keystorePassword) : base(keystore, keystorePassword)
{
}
public SSLSocketFactoryEx(KeyStore keystore, string keystorePassword, KeyStore truststore) : base(keystore, keystorePassword, truststore)
{
}
public override Java.Net.Socket CreateSocket(Java.Net.Socket socket, string host, int port, bool autoClose)
{
return sslContext.SocketFactory.CreateSocket(socket, host, port, autoClose);
}
public override Java.Net.Socket CreateSocket()
{
return sslContext.SocketFactory.CreateSocket();
}
public Java.Net.Socket ConnectSocket(Java.Net.Socket socket, string host, int port, InetAddress localAddress, int localPort, IHttpParams @params)
{
SocketAddress address = new InetSocketAddress(host, port);
try
{
socket.Connect(address);
}
catch (Exception e)
{
// TODO Auto-generated catch block
Console.WriteLine(e.StackTrace);
}// 连接远程主机
return socket;
}
/// <summary>
/// 直接返回是安全的
/// </summary>
/// <param name="sock"></param>
/// <returns></returns>
public bool IsSecure(Java.Net.Socket sock)
{
return true;
}
}
}
Xamarin生成之后的Java代码是这样的
package md59ec0712001a0e18b175d1b41ba922255;
public class SSLSocketFactoryEx
extends org.apache.http.conn.ssl.SSLSocketFactory
implements
mono.android.IGCUserPeer
{
/** @hide */
public static final String __md_methods;
static {
__md_methods =
"n_createSocket:(Ljava/net/Socket;Ljava/lang/String;IZ)Ljava/net/Socket;:GetCreateSocket_Ljava_net_Socket_Ljava_lang_String_IZHandler\n" +
"n_createSocket:()Ljava/net/Socket;:GetCreateSocketHandler\n" +
"";
mono.android.Runtime.register ("AndroidPay.Droid.WeChat.SSLSocketFactoryEx, AndroidPay.Android", SSLSocketFactoryEx.class, __md_methods);
}
public SSLSocketFactoryEx (java.lang.String p0, java.security.KeyStore p1, java.lang.String p2, java.security.KeyStore p3, java.security.SecureRandom p4, org.apache.http.conn.scheme.HostNameResolver p5)
{
super (p0, p1, p2, p3, p4, p5);
if (getClass () == SSLSocketFactoryEx.class)
mono.android.TypeManager.Activate ("AndroidPay.Droid.WeChat.SSLSocketFactoryEx, AndroidPay.Android", "System.String, mscorlib:Java.Security.KeyStore, Mono.Android:System.String, mscorlib:Java.Security.KeyStore, Mono.Android:Java.Security.SecureRandom, Mono.Android:Org.Apache.Http.Conn.Schemes.IHostNameResolver, Mono.Android", this, new java.lang.Object[] { p0, p1, p2, p3, p4, p5 });
}
public SSLSocketFactoryEx (java.security.KeyStore p0)
{
super (p0);
if (getClass () == SSLSocketFactoryEx.class)
mono.android.TypeManager.Activate ("AndroidPay.Droid.WeChat.SSLSocketFactoryEx, AndroidPay.Android", "Java.Security.KeyStore, Mono.Android", this, new java.lang.Object[] { p0 });
}
public SSLSocketFactoryEx (java.security.KeyStore p0, java.lang.String p1)
{
super (p0, p1);
if (getClass () == SSLSocketFactoryEx.class)
mono.android.TypeManager.Activate ("AndroidPay.Droid.WeChat.SSLSocketFactoryEx, AndroidPay.Android", "Java.Security.KeyStore, Mono.Android:System.String, mscorlib", this, new java.lang.Object[] { p0, p1 });
}
public SSLSocketFactoryEx (java.security.KeyStore p0, java.lang.String p1, java.security.KeyStore p2)
{
super (p0, p1, p2);
if (getClass () == SSLSocketFactoryEx.class)
mono.android.TypeManager.Activate ("AndroidPay.Droid.WeChat.SSLSocketFactoryEx, AndroidPay.Android", "Java.Security.KeyStore, Mono.Android:System.String, mscorlib:Java.Security.KeyStore, Mono.Android", this, new java.lang.Object[] { p0, p1, p2 });
}
public java.net.Socket createSocket (java.net.Socket p0, java.lang.String p1, int p2, boolean p3)
{
return n_createSocket (p0, p1, p2, p3);
}
private native java.net.Socket n_createSocket (java.net.Socket p0, java.lang.String p1, int p2, boolean p3);
public java.net.Socket createSocket ()
{
return n_createSocket ();
}
private native java.net.Socket n_createSocket ();
private java.util.ArrayList refList;
public void monodroidAddReference (java.lang.Object obj)
{
if (refList == null)
refList = new java.util.ArrayList ();
refList.add (obj);
}
public void monodroidClearReferences ()
{
if (refList != null)
refList.clear ();
}
}
正确生成的Java代码应该是这样的(里面应当有throws的处理)
package test;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
public class SSLSocketFactoryEx
extends org.apache.http.conn.ssl.SSLSocketFactory
{
/** @hide */
public static final String __md_methods;
static {
__md_methods =
"n_createSocket:(Ljava/net/Socket;Ljava/lang/String;IZ)Ljava/net/Socket;:GetCreateSocket_Ljava_net_Socket_Ljava_lang_String_IZHandler\n" +
"n_createSocket:()Ljava/net/Socket;:GetCreateSocketHandler\n" +
"";
}
public SSLSocketFactoryEx (java.lang.String p0, java.security.KeyStore p1, java.lang.String p2, java.security.KeyStore p3, java.security.SecureRandom p4, org.apache.http.conn.scheme.HostNameResolver p5) throws KeyManagementException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException
{
super (p0, p1, p2, p3, p4, p5);
}
public SSLSocketFactoryEx (java.security.KeyStore p0) throws KeyManagementException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException
{
super (p0);
}
public SSLSocketFactoryEx (java.security.KeyStore p0, java.lang.String p1) throws KeyManagementException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException
{
super (p0, p1);
}
public SSLSocketFactoryEx (java.security.KeyStore p0, java.lang.String p1, java.security.KeyStore p2) throws KeyManagementException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException
{
super (p0, p1, p2);
}
public java.net.Socket createSocket (java.net.Socket p0, java.lang.String p1, int p2, boolean p3)
{
return n_createSocket (p0, p1, p2, p3);
}
private native java.net.Socket n_createSocket (java.net.Socket p0, java.lang.String p1, int p2, boolean p3);
public java.net.Socket createSocket ()
{
return n_createSocket ();
}
private native java.net.Socket n_createSocket ();
private java.util.ArrayList refList;
public void monodroidAddReference (java.lang.Object obj)
{
if (refList == null)
refList = new java.util.ArrayList ();
refList.add (obj);
}
public void monodroidClearReferences ()
{
if (refList != null)
refList.clear ();
}
}
疑问
这个Xamarin应该在存在C#代码到Java代码转换的缺陷。
寻求帮助
由于每次生成,Java文件都会重新生成一次。改了也没用,报错依然存在。有谁有办法能从代码中直接进行优化?