Вот метод, который возвращает методы с конкретными аннотациями:
public static List getMethodsAnnotatedWith(final Class> type, final Class extends Annotation> annotation) {
final List methods = new ArrayList();
Class> klass = type;
while (klass != Object.class) { // need to iterated thought hierarchy in order to retrieve methods from above the current instance
// iterate though the list of methods declared in the class represented by klass variable, and add those annotated with the specified annotation
final List allMethods = new ArrayList(Arrays.asList(klass.getDeclaredMethods()));
for (final Method method : allMethods) {
if (method.isAnnotationPresent(annotation)) {
Annotation annotInstance = method.getAnnotation(annotation);
// TODO process annotInstance
methods.add(method);
}
}
// move to the upper class in the hierarchy in search for more methods
klass = klass.getSuperclass();
}
return methods;
}
Его можно легко модифицировать в соответствии с вашими конкретными потребностями. Обратите внимание, что предоставленный метод обходит иерархию классов, чтобы найти методы с требуемыми аннотациями.
Ниже приведен метод для ваших конкретных потребностей:
public static List getMethodsAnnotatedWithMethodXY(final Class> type) {
final List methods = new ArrayList();
Class> klass = type;
while (klass != Object.class) { // need to iterated thought hierarchy in order to retrieve methods from above the current instance
// iterate though the list of methods declared in the class represented by klass variable, and add those annotated with the specified annotation
final List allMethods = new ArrayList(Arrays.asList(klass.getDeclaredMethods()));
for (final Method method : allMethods) {
if (method.isAnnotationPresent(MethodXY.class)) {
MethodXY annotInstance = method.getAnnotation(MethodXY.class);
if (annotInstance.x() == 3 && annotInstance.y() == 2) {
methods.add(method);
}
}
}
// move to the upper class in the hierarchy in search for more methods
klass = klass.getSuperclass();
}
return methods;
}
Для вызова найденного метода (s) PLS ссылаются на учебник . Одной из потенциальных трудностей здесь является количество аргументов метода, которые могут варьироваться между найденными методами и, следовательно, требуют некоторой дополнительной обработки.
Вместо того, чтобы использовать /regex/g
синтаксис, можно создать новое объект RegExp:
var replace = "regex";
var re = new RegExp(replace,"g");
можно динамично создать объекты regex этот путь. Затем Вы сделаете:
"mystring".replace(re, "newstring");
Это:
var txt=new RegExp(pattern,attributes);
эквивалентно этому:
var txt=/pattern/attributes;
this.replace( new RegExp( replaceThis, 'g' ), withThis );
"ABABAB".replace(/B/g, "A");
Как всегда: не используйте regex, если Вы не имеете к. Для замены простой строки идиома:
'ABABAB'.split('B').join('A')
Затем Вы не должны волноваться о проблемах заключения в кавычки, упомянутых в ответе Gracenotes.
В то время как можно сделать динамично созданный RegExp (согласно другим ответам на этот вопрос), я повторю свой комментарий от подобное сообщение : функциональная форма String.replace () чрезвычайно полезен и во многих случаях уменьшает потребность в динамично созданных Объектах RegExp. (которые являются своего рода болью, потому что необходимо выразить вход конструктору RegExp как строка, а не использовать наклонные черты / [A-Z] + / regexp литеральный формат)
Как Eric Wendelin упомянул, можно сделать что-то вроде этого:
str1 = "pattern"
var re = new RegExp(str1, "g");
"pattern matching .".replace(re, "regex");
Это уступает "regex matching ."
. Однако это перестанет работать, если str1 будет "."
. Вы ожидали бы, что результат будет "pattern matching regex"
, заменяя период "regex"
, но это окажется...
regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex
Это вызвано тем, что, хотя "."
Строка, в конструкторе RegExp, она все еще интерпретируется как регулярное выражение, означая любой символ неразрыва строки, означая каждый символ в строке. С этой целью следующая функция может быть полезной:
RegExp.quote = function(str) {
return str.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
};
Затем можно сделать:
str1 = "."
var re = new RegExp(RegExp.quote(str1), "g");
"pattern matching .".replace(re, "regex");
получение "pattern matching regex"
.
String.prototype.replaceAll = function (replaceThis, withThis) {
var re = new RegExp(replaceThis,"g");
return this.replace(re, withThis);
};
var aa = "abab54..aba".replaceAll("\\.", "v");
Тест с этим инструмент
Это сам вызывание функции выполнит итерации по replacerItems использования индекса и изменит replacerItems [индекс] глобально на строке с каждой передачей.
const replacerItems = ["a", "b", "c"];
function replacer(str, index){
const item = replacerItems[index];
const regex = new RegExp(`[${item}]`, "g");
const newStr = str.replace(regex, "z");
if (index < replacerItems.length - 1) {
return replacer(newStr, index + 1);
}
return newStr;
}
// console.log(replacer('abcdefg', 0)) will output 'zzzdefg'