1

サブクラスを手動で記述せずに、 @MyFormat アノテーションの値で書式設定された Date ではなく、Person インスタンスを受け取り、誕生日を文字列として返すクラスを生成するにはどうすればよいですか?

目的は、生成されたインスタンスを HTML ページの生成に使用することです。

class Person {

    @MyFormat("%td.%<tm.%<tY")
    public Date getBirthday() { return birthday; }
}

// Usage somewhere in the code

...
List<Person> people = people.parallelStream()
    .map(p -> MyFormatInterceptor.wrap(p))
    .collect(toCollection(ArrayList::new));


System.out.println(people.iterator().next().getBirtday()) // 31.Mai.2015

私はこれを持っています(下記参照)。

呼び出しは式 "person.birthday" の評価からのリフレクションによって行われるため、戻り値の型が Date から String に変更されても問題ありません。

new ByteBuddy()
   .subclass(person.getClass())
   .method(isAnnotatedWith(MyFormat.class))
   .intercept(MethodDelegation.to(MyFormatInterceptor.class))
   .make()
   .load(person.getClass().getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
   .getLoaded();

class MyFormatInterceptor {

    @RuntimeType 
    public static Object format(@Origin Method m, @SuperCall Callable<?> zuper) {

        MyFormat formatAnnotation = m.getAnnotation(MyFormat.class);

        return String.format(formatAnnotation.value(), zuper.call());
    }
}

したがって、新しいクラスのメソッド名は「String getBirthday()」と同じですが、戻り値は String になります。


jszipを使用してSafari 8でzipファイルをファイル名と拡張子で保存するにはどうすればよいですか?

ライブラリzipを使用してクライアント側にファイルを保存したい。jszip

これが私のコードです:

function zipDownload(){
    var fileName ="test.zip",
        zip = new JSZip(),
        content,
        img,
        data;

    zip.file("hello.txt", "Hello World\n");
    data = zip.generate({type: $.isFunction(window.Blob) ? "blob" : "base64"});
    fileLoader.saveAs(fileName, "application/zip", data);
}

Safari 8 を除くすべての最新のブラウザーで問題なく動作します。

Safari 8 は、ファイル拡張子を持つファイルを保存できません。

これはサンプルhttp://jsfiddle.net/uvhy34ar/3/で、この問題の動作を示しています。

4

1 に答える 1

1

あなたが達成しようとしていることを理解しているかどうかは完全にはわかりません。次のコードは、Person使用しないサブクラスを作成しています。

new ByteBuddy()
  .subclass(person.getClass())
  .method(isAnnotatedWith(MyFormat.class))
  .intercept(MethodDelegation.to(MyFormatInterceptor.class))
  .make()
  .load(person.getClass().getClassLoader(),                  
        ClassLoadingStrategy.Default.WRAPPER)
  .getLoaded();

この生成されたサブクラスを実行時に使用すると、値を にキャストできないため、getBirthdayメソッドを呼び出すと が発生します。リフレクション経由でメソッドを呼び出した場合でも、Byte Buddy は戻り値の型を変更しません。ClassCastExceptionStringDate

于 2015-05-09T21:48:47.640 に答える