我有一个 SimplePojo 类,我想使用反射在运行时检索参数修饰符。
然而,它似乎不起作用...... SSCEE
public final class SimplePojo {
private final String name;
private final int age;
public SimplePojo(String name, final int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setAge(int age) {
}
public int getAge() {
return age;
}
}
这就是我尝试检查参数修饰符是否为 FINAL
的方法for (Class<?> paramClazz : method.getParameterTypes()) {
if (!Modifier.isFinal(paramClazz.getModifiers())) {
throw new ConstraintViolationException(
String.format("Parameters of method '%s' in '%s' must be declared as 'final'",
method.getName(),
point.getTarget().getClass().getCanonicalName()
)
);
}
}
编辑:
//are all constructors params final
for (Constructor constructor : clazz.getConstructors()) {
for (Class<?> constructorParam : constructor.getParameterTypes()) {
Log.e(TAG, "constructorParam:" + constructorParam.getName() + ", mod: " + constructorParam.getModifiers());
if (!Modifier.isFinal(constructorParam.getModifiers())) {
throw new ConstraintViolationException(
String.format("Constructor parameters in '%s' annotated with '%s'" +
" must be declared as 'final'",
clazz.getCanonicalName(),
Inmutable.class.getSimpleName()
)
);
}
}
}
并输出:
constructorParam:java.lang.String, mod: 17
constructorParam:int, mod: 1041
答案 0 :(得分:2)
假设您使用的是Java 8,则可以使用This post方法获取Method
的形式参数。
这将返回Parameter
个实例的数组,您可以在其上调用Executable.getParameters()
。
我不相信有一个标准的Java 8之前的解决方案。
答案 1 :(得分:-2)
getModifiers返回一组标记。
试试这个:
final int FINAL = 0x0010;
if (!(paramClazz.getModifiers() & FINAL)) {
throw new ...