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);
}
}
答案 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,因此不能保证此功能在将来的版本中保持不变。