我有一個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
這是因爲'paramClazz.getModifiers()'正在返回類*的修飾符*,而不是它用作參數。 –
@AndyTurner我不這麼認爲......我已經編輯了代碼,因爲您可以看到修飾符值不同。 – spili
這絕對是如此。 'Class'實例是singleton(每個類加載器),所以'Class.getModifiers()'必須總是返回相同的值 - 它們不依賴於使用該類的上下文,因爲'Class'實例沒有知道的方式。 –