これは、主にJUnitのオブジェクトファクトリのために、オブジェクトのフィールドに怠惰に入力するために私がいじくり回してきたコードですが、これは非常に便利な方法である可能性があります。
private void lazyObjectFill(Object profil) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
final Method[] list = profil.getClass().getDeclaredMethods();
for (Method m : list) {
if (Modifier.isPublic(m.getModifiers()) && m.getName().startsWith("set")) {
final Class< ?>[] parameterTypes = m.getParameterTypes();
if (parameterTypes.length == 1) {
final Class< ?> clazz = parameterTypes[0];
if (clazz == String.class) {
log.info("Invoking " + m.getName() + " with [\"\"]");
m.invoke("");
} else if (clazz.isPrimitive() && Defaults.defaultValue(clazz) != null) {
log.info("Invoking " + m.getName() + " with [" + Defaults.defaultValue(clazz) + "]");
m.invoke(Defaults.defaultValue(clazz));
}
}
}
}
}
このコードをオブジェクトで実行すると、次の例外が発生します。
java.lang.IllegalArgumentException: object is not an instance of declaring class
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:592)
m.invoke( "");を実行すると例外が発生します。文字列セッター。
googlersの利益のためにソースコードを更新しました。
private void lazyObjectFill(Object obj) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
final Method[] list = obj.getClass().getDeclaredMethods();
for (Method method : list) {
method.setAccessible(true);
if (Modifier.isPublic(method.getModifiers()) && method.getName().startsWith("set")) {
final Class< ?>[] parameterTypes = method.getParameterTypes();
if (parameterTypes.length == 1) {
final Class< ?> clazz = parameterTypes[0];
if (clazz == String.class) {
log.info("Invoking " + method.getName() + " with [\"\"]");
method.invoke(obj, "");
} else if (clazz.isPrimitive() && Defaults.defaultValue(clazz) != null) {
log.info("Invoking " + method.getName() + " with [" + Defaults.defaultValue(clazz) + "]");
method.invoke(obj, Defaults.defaultValue(clazz));
}
}
}
}
}