.net反射技术的应用—如何调用Java的COM接口[转]
        前两天做了一个银行的电子支付接口,我用的是C#开发语言,银行给我们的是Java的COM组件(名字是:RSASig.class),按照银行的说明,一步一步做了配置,大家都知道Java的COM在windows上注册之后是没有动态链接库的,那该怎么在C#中调用其中的方法呢?如果用过.Net反射技术的朋友们很快就会想到使用反射。下面是C#实现反射代码:
从这段代码中可以看出,这是需要动态链接库的。而Java却没有,怎么用呢?这是摆在面前的一个问题。再仔细看看他的说明,他们在ASP中是这么调用的,Set Obj = Server.CreateObject("ccb.pub.RSAsig"),灵机一动,在VB中是不是也可以这么用呢?马上就就在VB中作了一个实验,结果成功了,VB中的代码是这样实现的:
 Namespace test
Namespace test
 Public Class cJava
    Public Class cJava  
 Dim obj As Object = Nothing
        Dim obj As Object = Nothing

 Public Sub New()
        Public Sub New()
 obj = GetObject("java:RSASig")
            obj = GetObject("java:RSASig")
 End Sub
        End Sub

 Public Function generateKeys() As Object
        Public Function generateKeys() As Object
 Return obj.generateKeys()
            Return obj.generateKeys()
 End Function
        End Function

 Public Function getPrivateKey() As String
        Public Function getPrivateKey() As String
 Return obj.getPrivateKey()
            Return obj.getPrivateKey()
 End Function
        End Function
 Public Function getPublicKey() As String
        Public Function getPublicKey() As String
 Return obj.getPublicKey()
            Return obj.getPublicKey()
 End Function
        End Function
 '签名结果信息
        '签名结果信息
 Public Function generateSigature(ByVal singstr As String) As String
        Public Function generateSigature(ByVal singstr As String) As String
 Return obj.generateSigature(singstr)
            Return obj.generateSigature(singstr)
 End Function
        End Function

 Public Function setPublicKey(ByVal pubKey As String) As String
        Public Function setPublicKey(ByVal pubKey As String) As String
 Return obj.setPublicKey(pubKey)
            Return obj.setPublicKey(pubKey)
 End Function
        End Function

 Public Function verifySigature(ByVal orginstr As String, ByVal sigStr As String) As Object
        Public Function verifySigature(ByVal orginstr As String, ByVal sigStr As String) As Object
 Return obj.verifySigature(sigStr, orginstr)
            Return obj.verifySigature(sigStr, orginstr)
 End Function
        End Function
 End Class
    End Class
 End Namespace
End Namespace
于是就把它封装成类库,然后在C#中调用,OK,成功了。苦苦寻找了一个星期.net怎么调用Java类中的方法,终于在此画上了一个句号。
不知道这算不算是.net和java互操作的一个案例。希望这篇文章能对还正在苦苦寻觅.net和java互操作的朋友有点启发。
 1 Assembly assembly = null;
Assembly assembly = null;
2 Type type = null;
Type type = null;
3 string dllPath = @"c:\Reflected.dll"
string dllPath = @"c:\Reflected.dll"
4 try
try
5 {
{
6 assembly = Assembly.LoadFile(dllPath);
    assembly = Assembly.LoadFile(dllPath);
7 type = assembly.GetType(typeName,true,true);//cMyResult
    type = assembly.GetType(typeName,true,true);//cMyResult
8 }
}
9 catch(FileNotFoundException)
catch(FileNotFoundException)
10 {
{
11 errMsg = "Could not load Assembly: \""+ dllPath +"\"";
    errMsg = "Could not load Assembly: \""+ dllPath +"\"";
12 return null;
    return null;
13 }
}
14 catch(TypeLoadException)
catch(TypeLoadException)
15 {
{
16 errMsg = "Could not load Type: \"string\" \n from assembly: \"" + dllPath + "\"";
    errMsg = "Could not load Type: \"string\" \n from assembly: \"" + dllPath + "\"";
17 return null;
    return null;
18 }
}
19
20 MethodInfo method = type.GetMethod(methodName);//提取方法信息
MethodInfo method = type.GetMethod(methodName);//提取方法信息
21 object obj = assembly.CreateInstance(typeName);//创建实例
object obj = assembly.CreateInstance(typeName);//创建实例
22
23 object s = method.Invoke(obj,parameters);//new object[]{"jiangli"});
object s = method.Invoke(obj,parameters);//new object[]{"jiangli"});
24 assembly = null;
assembly = null;
25 type = null;
type = null;
26 method =null;
method =null;
27
 Assembly assembly = null;
Assembly assembly = null;2
 Type type = null;
Type type = null;3
 string dllPath = @"c:\Reflected.dll"
string dllPath = @"c:\Reflected.dll"4
 try
try5
 {
{6
 assembly = Assembly.LoadFile(dllPath);
    assembly = Assembly.LoadFile(dllPath);7
 type = assembly.GetType(typeName,true,true);//cMyResult
    type = assembly.GetType(typeName,true,true);//cMyResult8
 }
}9
 catch(FileNotFoundException)
catch(FileNotFoundException)10
 {
{11
 errMsg = "Could not load Assembly: \""+ dllPath +"\"";
    errMsg = "Could not load Assembly: \""+ dllPath +"\"";12
 return null;
    return null;13
 }
}14
 catch(TypeLoadException)
catch(TypeLoadException)15
 {
{16
 errMsg = "Could not load Type: \"string\" \n from assembly: \"" + dllPath + "\"";
    errMsg = "Could not load Type: \"string\" \n from assembly: \"" + dllPath + "\"";17
 return null;
    return null;18
 }
}19

20
 MethodInfo method = type.GetMethod(methodName);//提取方法信息
MethodInfo method = type.GetMethod(methodName);//提取方法信息21
 object obj = assembly.CreateInstance(typeName);//创建实例
object obj = assembly.CreateInstance(typeName);//创建实例22

23
 object s = method.Invoke(obj,parameters);//new object[]{"jiangli"});
object s = method.Invoke(obj,parameters);//new object[]{"jiangli"});24
 assembly = null;
assembly = null;25
 type = null;
type = null;26
 method =null;
method =null;27

从这段代码中可以看出,这是需要动态链接库的。而Java却没有,怎么用呢?这是摆在面前的一个问题。再仔细看看他的说明,他们在ASP中是这么调用的,Set Obj = Server.CreateObject("ccb.pub.RSAsig"),灵机一动,在VB中是不是也可以这么用呢?马上就就在VB中作了一个实验,结果成功了,VB中的代码是这样实现的:
 Namespace test
Namespace test Public Class cJava
    Public Class cJava   Dim obj As Object = Nothing
        Dim obj As Object = Nothing
 Public Sub New()
        Public Sub New() obj = GetObject("java:RSASig")
            obj = GetObject("java:RSASig") End Sub
        End Sub
 Public Function generateKeys() As Object
        Public Function generateKeys() As Object Return obj.generateKeys()
            Return obj.generateKeys() End Function
        End Function
 Public Function getPrivateKey() As String
        Public Function getPrivateKey() As String Return obj.getPrivateKey()
            Return obj.getPrivateKey() End Function
        End Function Public Function getPublicKey() As String
        Public Function getPublicKey() As String Return obj.getPublicKey()
            Return obj.getPublicKey() End Function
        End Function '签名结果信息
        '签名结果信息 Public Function generateSigature(ByVal singstr As String) As String
        Public Function generateSigature(ByVal singstr As String) As String Return obj.generateSigature(singstr)
            Return obj.generateSigature(singstr) End Function
        End Function
 Public Function setPublicKey(ByVal pubKey As String) As String
        Public Function setPublicKey(ByVal pubKey As String) As String Return obj.setPublicKey(pubKey)
            Return obj.setPublicKey(pubKey) End Function
        End Function
 Public Function verifySigature(ByVal orginstr As String, ByVal sigStr As String) As Object
        Public Function verifySigature(ByVal orginstr As String, ByVal sigStr As String) As Object Return obj.verifySigature(sigStr, orginstr)
            Return obj.verifySigature(sigStr, orginstr) End Function
        End Function End Class
    End Class End Namespace
End Namespace于是就把它封装成类库,然后在C#中调用,OK,成功了。苦苦寻找了一个星期.net怎么调用Java类中的方法,终于在此画上了一个句号。
不知道这算不算是.net和java互操作的一个案例。希望这篇文章能对还正在苦苦寻觅.net和java互操作的朋友有点启发。
 
                    
                     
                    
                 
                    
                

 
     
                
            
         
 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号