ます - これはコードをリファクタリングしないという言い訳ではなく、そうし続けることを望みますが、実際には、混乱をさらに悪化させるために実際にAspectJは必要ありません。反射フィールドアクセスのための
ヘルパークラス:
package de.scrum_master.app;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;
public class FieldHelper {
public static Field getField(Class<?> clazz, String fieldName) {
Field field;
try {
field = clazz.getDeclaredField(fieldName);
} catch (NoSuchFieldException | SecurityException e) {
throw new RuntimeException("Reflection problem", e);
}
field.setAccessible(true);
return field;
}
public static Field[] getFields(Class<?> clazz) {
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields)
field.setAccessible(true);
return fields;
}
public static List<String> extractIgnoredFieldsList(Class<?> clazz, String fieldName) {
return Arrays.asList(
getField(clazz, fieldName)
.getAnnotation(IgnoreFields.class)
.fieldNames()
);
}
}
マーカー注釈:呼び出されるメソッドと
package de.scrum_master.app;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface IgnoreFields {
public String[] fieldNames();
}
クラス:
あなたはこのようにそれを単に行うことができます
package de.scrum_master.app;
import java.lang.reflect.Field;
import java.util.Date;
import java.util.List;
import static de.scrum_master.app.FieldHelper.*;
public class A {
int number = 11;
String text = "Hi there!";
Date date = new Date();
String optionalText = "I am not really always needed";
int optionalNumber = 123;
public void doSomething(List<String> ignoredFields) {
for (Field field : getFields(this.getClass())) {
if (!ignoredFields.contains(field.getName())) {
try {
System.out.println(field.getName() + " = " + field.get(this));
} catch (IllegalArgumentException | IllegalAccessException e) {
throw new RuntimeException("Reflection problem", e);
}
}
}
}
}
注釈付きのメンバーフィールドを持つ
クラス:
package de.scrum_master.app;
import static de.scrum_master.app.FieldHelper.*;
public class B {
@IgnoreFields(fieldNames = { "optionalText", "optionalNumber" })
A noOptionalsA = new A();
@IgnoreFields(fieldNames = { "text", "number", "date" })
A onlyOptionalsA = new A();
public static void main(String[] args) {
B b = new B();
b.noOptionalsA.doSomething(extractIgnoredFieldsList(b.getClass(), "noOptionalsA"));
System.out.println("----------------------------------------");
b.onlyOptionalsA.doSomething(extractIgnoredFieldsList(b.getClass(), "onlyOptionalsA"));
}
}
コンソールログ:
number = 11
text = Hi there!
date = Wed Dec 27 18:54:44 ICT 2017
----------------------------------------
optionalText = I am not really always needed
optionalNumber = 123
あなたはここで何が起こっているのか理解していない場合、または、あなたはまだ、AspectJの溶液にしてくださいと主張している場合私に知らせてください、そして、私は説明して、そして/または余分なアスペクトコードを提供します。
私が答える前に私はあなたに明確にして欲しい:「データをアドバイスからメソッド 'b()'に転送することはどういう意味ですか? (疑似)コードを編集し、そのデータをそのメソッドでどのように使用するかを教えてください。ところで、あなたは 'A'フィールドとそのフィールドに割り当てられたオブジェクトの接続に関していくつかの手帳を行う準備ができていますか?なぜなら、これは可能なのですが、アプリケーションの設計上、少し面倒です。 – kriegaex
私の擬似コードを更新しました。主なアイデアは、メソッドの実行中にこれらのフィールドが無視されるように、注釈値にリストされたフィールド名のリストをメソッドb()に渡すことです。 –
あなたの 'new B()。fieldA.b()'(ところで、括弧を忘れてしまった)メソッドの署名 'void b(String [] fieldsToIgnore)'と一致しないため、コンパイルされません。 AspectJの使用を開始する前でさえ、これはJavaの問題です。さらに、アプリケーションが(a)アプリケーションがアスペクトについて知っていて、アスペクトなしでは動作できない場合、(b)アスペクトがアノテーションに文字列としてリストされているフィールド名をあまりにも必要としている場合にのみ、アプリケーションの設計に間違いがあります。したがって、リファクタリング時に中断されます。これはクロスカッティングの問題ではなく、可能な場合でもAOPの使用例はありません。 – kriegaex