у моего проекта есть класс MessageUtil, у которого есть методы для отображения сообщений. Я пытаюсь сделать тексты своих Jlabels red с использованием aspectJ, без использования aspectJ достаточно добавить 'for loop' к одному из методов, который делает multiLabel текстовое сообщение:
public static JLabel[] createMultiLabel(String msg) {
JLabel[] messages = null;
if (msg.contains("\n")) {
messages = createMultiLabelBySlashN(msg);
} else {
messages = createMultiLabelByPixel(msg);
}
//this for loop makes the text red
for (int i = 0; i < messages.length; i++) {
messages[i].setForeground(Color.RED);
}
return messages;
}
Два метода createMultiLabelByPixel (msg) и createMultiLabelBySlashN (msg) находятся в этой форме:
private static JLabel[] createMultiLabelBySlashN(String msg) {
// the code here
}
Я хочу использовать aspectJ inorder, чтобы сделать JLabels красным, не используя цикл for в кубе метода createMultiLabel, я не знаю, как это сделать, я пытаюсь создать класс, содержащий аннотацию aspecJ с помощью pointCut ниже, чтобы сообщения массива были красными до отправки сообщений createMultiLabelBySlashN() и createMultiLabelByPixel() в качестве их параметра, но я не знаю, правильно ли это или как определить сообщения JLabel [] из метода createMultiLabel в моем аспектеJ класс, чтобы сделать его красным, используя тот же цикл, и отправить результат String для созданияMultiLabelBySlashN.
@Pointcut ("execution(public static JLabel[] mehad.util.MessageUtil.createMultiLabelBySlashN(..)) || execution(public static JLabel[] mehad.util.MessageUtil.createMultiLabelByPixel(..)" )
даже когда я вызываю pointCut, похоже, что есть ошибки с моим кодом, который гласит:
no match for this type name: JLabel
no match for this type name: JLabel
Это связано с тем, что вы не используете полное имя класса javax.swing.JLabel
.
Теперь давайте предположим, что ваш класс выглядит так (просто простая подделка):
package mehad.util;
import javax.swing.JLabel;
public class MessageUtil {
public static void main(String[] args) {
for (JLabel label : createMultiLabel("Albert Einstein\nWerner Heisenberg\nMax Planck"))
System.out.println(label.getText() + " / " + label.getForeground());
System.out.println();
for (JLabel label : createMultiLabel("Albert Einstein, Werner Heisenberg, Max Planck"))
System.out.println(label.getText() + " / " + label.getForeground());
}
public static JLabel[] createMultiLabel(String msg) {
return msg.contains("\n")
? createMultiLabelBySlashN(msg)
: createMultiLabelByPixel(msg);
}
private static JLabel[] createMultiLabelBySlashN(String msg) {
String[] lines = msg.split("\n+");
JLabel[] labels = new JLabel[lines.length];
for (int i = 0; i < lines.length; i++)
labels[i] = new JLabel(lines[i]);
return labels;
}
private static JLabel[] createMultiLabelByPixel(String msg) {
String[] words = msg.split("[, ]+");
JLabel[] labels = new JLabel[words.length];
for (int i = 0; i < words.length; i++)
labels[i] = new JLabel(words[i]);
return labels;
}
}
Теперь, если вы запустите main
метод без AspectJ, вы увидите этот консольный вывод:
Albert Einstein / sun.swing.PrintColorUIResource[r=51,g=51,b=51]
Werner Heisenberg / sun.swing.PrintColorUIResource[r=51,g=51,b=51]
Max Planck / sun.swing.PrintColorUIResource[r=51,g=51,b=51]
Albert / sun.swing.PrintColorUIResource[r=51,g=51,b=51]
Einstein / sun.swing.PrintColorUIResource[r=51,g=51,b=51]
Werner / sun.swing.PrintColorUIResource[r=51,g=51,b=51]
Heisenberg / sun.swing.PrintColorUIResource[r=51,g=51,b=51]
Max / sun.swing.PrintColorUIResource[r=51,g=51,b=51]
Planck / sun.swing.PrintColorUIResource[r=51,g=51,b=51]
Т.е. все метки имеют серый цвет по умолчанию. Теперь добавьте этот аспект:
package de.scrum_master.aspect;
import java.awt.Color;
import javax.swing.JLabel;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class RedLabelAspect {
@Pointcut("execution(static javax.swing.JLabel[] createMultiLabel(..))")
public void multilabelCreation() {}
@Around("multilabelCreation()")
public JLabel[] changeLabelColours(ProceedingJoinPoint thisJoinPoint) throws Throwable {
JLabel[] labels = (JLabel[]) thisJoinPoint.proceed();
for (JLabel label : labels)
label.setForeground(Color.RED);
return labels;
}
}
Аспект изменяет метки, содержащиеся в массиве результатов, то есть цикл for
теперь находится в вашем коде аспекта, больше не в базовом коде. Выход консоли изменяется на:
Albert Einstein / java.awt.Color[r=255,g=0,b=0]
Werner Heisenberg / java.awt.Color[r=255,g=0,b=0]
Max Planck / java.awt.Color[r=255,g=0,b=0]
Albert / java.awt.Color[r=255,g=0,b=0]
Einstein / java.awt.Color[r=255,g=0,b=0]
Werner / java.awt.Color[r=255,g=0,b=0]
Heisenberg / java.awt.Color[r=255,g=0,b=0]
Max / java.awt.Color[r=255,g=0,b=0]
Planck / java.awt.Color[r=255,g=0,b=0]
Voilà - сквозная проблема окраски этикеток была модульной в один аспект.
createMultiLabel
в любом классе, см. Руководство по программированию AspectJ . Это не на 100% точно, но сколько подходящих имен методов у вас в системе? ;-)