正则表达式

时间:2017-07-21 07:40:19

标签: java reflection

java.util.regex.Pattern有一个方法Map<String, Integer> namedGroups()。出于某种原因,他们决定将其设为私有,因此无法获得这些非常有用的信息! :(

我尝试使用此助手类访问此信息(只读):

package java.util.regex;

import java.util.Collections;
import java.util.Map;

public class PatternHelper {
    public static Map<String, Integer> getNamedGroups(Pattern pattern) {
        return Collections.unmodifiableMap(pattern.namedGroups());
    }
}

但是Java8抱怨java.lang.SecurityException: Prohibited package name: java.util.regex

如何访问此信息(只读)? 也许是通过反思?

更新 使用反射的程序失败。有什么想法吗?

import java.lang.reflect.Method;
import java.util.regex.Pattern;

public class Test50 {
    public static void main(String[] args) throws Exception {
        Pattern p = Pattern.compile("(?<word>\\w+)(?<num>\\d+)");
        Method method = Pattern.class.getMethod("namedGroups");  // it fails with NoSuchMethodException: java.util.regex.Pattern.namedGroups()
        method.setAccessible(true);
        Object result = method.invoke(p);
        System.out.println("result: " + result);
    }
}

1 个答案:

答案 0 :(得分:1)

getMethod will only find public methods

尝试:

Pattern p = Pattern.compile("(?<word>\\w+)(?<num>\\d+)");
Method method = Pattern.class.getDeclaredMethod("namedGroups");
method.setAccessible(true);
Object result = method.invoke(p);
System.out.println("result: " + result);

打印: result: {word=1, num=2}

此外,通过grepCode查看似乎表明在JDK 7之前namedGroups不存在(至少在OpenJDK中),因此也可能考虑因素。我会谨慎使用这样的解决方案,因为这不是公共API,因此不能保证此功能在将来的版本中保持不变。