AspectJ GUIアプリの国際化

はじめに

  • AspectJ ログ で作った、おみくじアプリのソースコードに手を加えずに国際化したい
    Ajdt4.png
  • こんなかんじ
    Ajdt5.png

どうするか?

  • Swingアプリの JButton#setText() や JFrame#setTitle() を AspectJ の @Around アドバイス を使って乗っ取ってやればいい
  • OmikujiI18N アスペクトを作成する
    Ajdt6.png
    1. 本来 OmikujiUI 内で、?#setText( english ) や ?#setTitle( english ) しているところを乗っ取り、
    2. english をキーに label_ja.properties から日本語訳(japanese)を取り出し、
    3. ?#setText( japanese ) 、?#setTitle( japanese ) している。
    • label_ja.properties は、こんな感じ
      excellent_lucky=今日は大吉。
      lucky=今日は小吉。
      a_bit_lucky=今日は吉。
      misfortune=今日は凶。
      greate_misfortune=今日は大凶。
      Consult_an_Oracle=おみくじを引く
      Fortune=おみくじ
      ERROR=一日に何回も引くな!
      ※propertiesファイルのキーにスペースは使えないので、" " は "_" に置換している

OmikujiI18Nアスペクト

Everything is expanded. Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 
 
 
 
 
 
 
 
 
 
 
-
|
|
-
|
|
|
|
|
-
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
|
|
|
-
|
-
|
-
|
!
|
|
!
!
!
|
!
package com.snail.exam.aj.omikuji;
 
import java.util.Locale;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
 
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
 
@Aspect
public class OmikujiI18N {
 
  @Around("call(* *.setText(String)) || call(* *.setTitle(String)))")
  public void setText(ProceedingJoinPoint thisJoinPoint) {
 
    // メソッド引数の取得
    Object[] args = thisJoinPoint.getArgs();
    String srcText = (String) args[0];
 
    try {
      // 第一引数を入れ替える
      String key = srcText.replaceAll(" ", "_").replaceAll("=", "_");
 
      ResourceBundle resource = PropertyResourceBundle.getBundle("label",
          Locale.getDefault(), this.getClass().getClassLoader());
      String destText = resource.getString(key);
 
      args[0] = destText;
      
      // メソッド( setText() / setTitle() )の実行。
      thisJoinPoint.proceed(args);
    } catch (Throwable th) {
      
      // 何らかのエラーが起きたときには、元の引数でメソッドを実行する
      // (label_ja.properties に変換するエントリがなかった場合)
      
      // System.out.println(srcText + "は、"
      // + Locale.getDefault().getDisplayLanguage() + "化できませんでした。");
 
      try {
        thisJoinPoint.proceed();
      } catch (Throwable ignoreEx) {
        // if RuntimeExceptin occurred, throw it.         if (ignoreEx instanceof RuntimeException) { throw (RuntimeException) ignoreEx; }
        // Should not happen         ignoreEx = null;
      }
    }
  }
 
}
  • @Around で乗っ取る メソッドの引数の取り出し方
    Object[] ProceedingJoinPoint#getArgs()
  • 乗っ取ったメソッドの実行
    Object ProceedingJoinPoint#proceed(Object[] args);
    Object ProceedingJoinPoint#proceed();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值