Hprose for Javaクライアント(二)


プロキシインタフェースによる同期呼び出し
invokeで同期呼び出しを行う方法を見てから、インタフェースで同期呼び出しを行う方法を見てみましょう.インタフェース方式による同期呼び出しはより直感的で便利であるが、動的呼び出しや参照パラメータ伝達はサポートされていない.
インタフェース定義
上記のメソッドを呼び出すには、まずインタフェースを定義する必要があります.次はインタフェースの定義です.
package hprose.exam;
import java.util.List;
import java.util.Map;
public interface IExam1 {
    String getId();
    int sum(int[] nums);
    int sum(short[] nums);
    int sum(long[] nums);
    int sum(double[] nums);
    int sum(String[] nums);
    double sum(List nums);
    Map<String, String> swapKeyAndValue(Map<String, String> strmap);
}

これはExam 1に対応するインタフェースで、Exam 1宣言と同じメソッド署名のほか、呼び出し中に自動的に正しいタイプに変換して呼び出すリロードメソッドもあります.
package hprose.exam;
public interface IExam2 {
    User[] getUserList();
}

このインタフェースはExam 2に対応し,戻りタイプはUser[]タイプに変更した.
上記のインタフェースから、hproseでは、クライアントとサーバ側のインタフェースが完全に一致する必要がなく、柔軟性が大幅に増加し、弱い言語とのインタラクションも容易になります.
ネームスペース付き(別名接頭辞)メソッド
invokeを使用する場合、名前空間(別名接頭辞)を持つメソッドを呼び出す場合は、メソッド名を接頭辞形式で書く必要がありますが、インタフェース呼び出しを使用する場合、プロキシオブジェクトを生成するときに、この作業を自動的に行うことができます.次の例を参照してください.
package hprose.exam;
import hprose.client.HproseHttpClient;
import java.io.IOException;
public class ClientExam5 {
    public static void main(String[] args) throws IOException {
        HproseHttpClient client = new HproseHttpClient();
        client.useService("http://localhost:8084/HproseExamServer/Methods");
        IExam1 exam1 = (IExam1) client.useService(IExam1.class, "ex1");
        IExam1 exam2 = (IExam1) client.useService(IExam1.class, "ex2");
        System.out.println(exam1.getId());
        System.out.println(exam2.getId());
    }
}

この例では、exam 1とexam 2はいずれもIExam 1のインタフェースオブジェクトであるが、異なる名前空間(別名接頭辞)が指定されているため、後述するgetIdメソッド呼び出し時に呼び出されるのは2つの異なるメソッドである.
実行結果は次のとおりです.
参照
Exam1
Exam2
可変パラメータと結果タイプ
次にsumメソッドの呼び出しを見てみましょう.
package hprose.exam;
import hprose.client.HproseHttpClient;
import java.io.IOException;
import java.util.ArrayList;
public class ClientExam6 {
    public static void main(String[] args) throws IOException {
        HproseHttpClient client = new HproseHttpClient();
        client.useService("http://localhost:8084/HproseExamServer/Methods");
        IExam1 exam = (IExam1) client.useService(IExam1.class, "ex1");
        System.out.println(exam.sum(new int[] {1,2,3,4,5}));
        System.out.println(exam.sum(new short[] {6,7,8,9,10}));
        System.out.println(exam.sum(new long[] {11,12,13,14,15}));
        System.out.println(exam.sum(new double[] {16,17,18,19,20}));
        System.out.println(exam.sum(new String[] {"21","22","23","24","25"}));
        ArrayList intList = new ArrayList();
        intList.add(26);
        intList.add(27);
        intList.add(28);
        intList.add(29);
        intList.add(30);
        System.out.println(exam.sum(intList));
    }
}

このプログラムの実行結果は、前にinvokeで実現したClientExam 2と同じで、このプログラムはより簡潔に見えますが、インタフェースを事前に定義する必要があります.インタフェース方式では呼び出し時に戻り値タイプを指定する必要はありません.Hproseはインタフェース宣言から戻り値タイプを自動的に取得します.
汎用パラメータと結果
次に、swapKeyAndValueメソッドの呼び出しについて説明します.
package hprose.exam;
import hprose.client.HproseHttpClient;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class ClientExam7 {
    public static void main(String[] args) throws IOException {
        HproseHttpClient client = new HproseHttpClient();
        client.useService("http://localhost:8084/HproseExamServer/Methods");
        IExam1 exam = (IExam1) client.useService(IExam1.class, "ex1");
        Map<String, String> map = new HashMap<String, String>();
        map.put("January", "Jan");
        map.put("February", "Feb");
        map.put("March", "Mar");
        map.put("April", "Apr");
        map.put("May", "May");
        map.put("June", "Jun");
        map.put("July", "Jul");
        map.put("August", "Aug");
        map.put("September", "Sep");
        map.put("October", "Oct");
        map.put("November", "Nov");
        map.put("December", "Dec");
        Map<String, String> map2 = exam.swapKeyAndValue(map);
        System.out.println(map);
        System.out.println(map2);
    }
}

実行結果は次のとおりです.
参照
{October=Oct, January=Jan, April=Apr, February=Feb, August=Aug, June=Jun, November=Nov, July=Jul, May=May, December=Dec, March=Mar, September=Sep}
{Sep=September, Feb=February, Mar=March, Apr=April, Oct=October, Jan=January, May=May, Nov=November, Dec=December, Jul=July, Aug=August, Jun=June}
汎用的に注意すべき問題は,前章で本手法の発表を紹介した際に既に説明したが,ここでは繰り返さない.
カスタムタイプ
次のコードでは、インタフェース内のメソッド署名は、サーバのメソッド署名とは異なり、正常に呼び出すことができます.
package hprose.exam;
import hprose.client.HproseHttpClient;
import java.io.IOException;
public class ClientExam8 {
    public static void main(String[] args) throws IOException {
        HproseHttpClient client = new HproseHttpClient();
        client.useService("http://localhost:8084/HproseExamServer/Methods");
        IExam2 exam2 = (IExam2) client.useService(IExam2.class, "ex2");
        User[] users = exam2.getUserList();
        for (User user : users) {
            System.out.printf("name: %s, ", user.getName());
            System.out.printf("age: %d, ", user.getAge());
            System.out.printf("sex: %s, ", user.getSex());
            System.out.printf("birthday: %s, ", user.getBirthday());
            System.out.printf("married: %s.", user.isMarried());
            System.out.println();
        }
    }
}

実行結果は次のとおりです.
参照
name: Amy, age: 26, sex: Female, birthday: 1983-12-03, married: true.
name: Bob, age: 20, sex: Male, birthday: 1989-06-12, married: false.
name: Chris, age: 29, sex: Unknown, birthday: 1980-03-08, married: true.
name: Alex, age: 17, sex: InterSex, birthday: 1992-06-14, married: false.
同様に、この例はHproseの使いやすさと柔軟性をよく説明しており、多くの説明をしなくても理解できると信じていますので、ここではあまり説明しません.