diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractRecord.java b/jOOQ/src/main/java/org/jooq/impl/AbstractRecord.java index 9c83f8521d..8c448f0480 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractRecord.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractRecord.java @@ -36,7 +36,6 @@ package org.jooq.impl; -import static org.jooq.impl.Util.accessible; import static org.jooq.impl.Util.getAnnotatedGetter; import static org.jooq.impl.Util.getAnnotatedMembers; import static org.jooq.impl.Util.getAnnotatedSetters; @@ -68,6 +67,7 @@ import org.jooq.Table; import org.jooq.UniqueKey; import org.jooq.exception.MappingException; import org.jooq.tools.Convert; +import org.jooq.tools.reflect.Reflect; /** * @author Lukas Eder @@ -621,7 +621,7 @@ abstract class AbstractRecord extends AbstractStore implements Record { try { // [#1340] Allow for using non-public default constructors - T result = accessible(type.getDeclaredConstructor()).newInstance(); + T result = Reflect.accessible(type.getDeclaredConstructor()).newInstance(); return intoMutablePOJO(type, result); } @@ -644,7 +644,7 @@ abstract class AbstractRecord extends AbstractStore implements Record { // Match the first constructor by parameter length if (parameterTypes.length == getFields().size()) { Object[] converted = Util.convert(parameterTypes, intoArray()); - return accessible(constructor).newInstance(converted); + return Reflect.accessible(constructor).newInstance(converted); } } diff --git a/jOOQ/src/main/java/org/jooq/impl/Util.java b/jOOQ/src/main/java/org/jooq/impl/Util.java index 01d0ce7642..bcd8afa2cd 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Util.java +++ b/jOOQ/src/main/java/org/jooq/impl/Util.java @@ -43,7 +43,6 @@ import static org.jooq.impl.Factory.nullSafe; import static org.jooq.impl.Factory.val; import static org.jooq.tools.StringUtils.leftPad; -import java.lang.reflect.AccessibleObject; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.sql.Blob; @@ -86,6 +85,7 @@ import org.jooq.tools.Convert; import org.jooq.tools.LoggerListener; import org.jooq.tools.StopWatchListener; import org.jooq.tools.StringUtils; +import org.jooq.tools.reflect.Reflect; /** * General jOOQ utilities @@ -171,7 +171,7 @@ final class Util { else { // [#919] Allow for accessing non-public constructors - result = accessible(type.getDeclaredConstructor()).newInstance(); + result = Reflect.accessible(type.getDeclaredConstructor()).newInstance(); } result.attach(configuration); @@ -851,17 +851,6 @@ final class Util { return result; } - /** - * Ensure an {@link AccessibleObject} is really accessible - */ - static final T accessible(T accessible) { - if (!accessible.isAccessible()) { - accessible.setAccessible(true); - } - - return accessible; - } - /** * Type-safely copy a value from one record to another */ @@ -926,7 +915,7 @@ final class Util { EXECUTE_LISTENERS.put(name, type); } - return (ExecuteListener) accessible(type.getDeclaredConstructor()).newInstance(); + return (ExecuteListener) Reflect.accessible(type.getDeclaredConstructor()).newInstance(); } catch (Exception e) { throw new RuntimeException(e); diff --git a/jOOQ/src/main/java/org/jooq/tools/reflect/Reflect.java b/jOOQ/src/main/java/org/jooq/tools/reflect/Reflect.java index 299495b680..bc5da7f1c8 100644 --- a/jOOQ/src/main/java/org/jooq/tools/reflect/Reflect.java +++ b/jOOQ/src/main/java/org/jooq/tools/reflect/Reflect.java @@ -1,5 +1,5 @@ /** - * Copyright (c) 2009-2012, Lukas Eder, lukas.eder@gmail.com + * Copyright (c) 2011-2012, Lukas Eder, lukas.eder@gmail.com * All rights reserved. * * This software is licensed to you under the Apache License, Version 2.0 @@ -35,6 +35,7 @@ */ package org.jooq.tools.reflect; +import java.lang.reflect.AccessibleObject; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationHandler; @@ -109,6 +110,24 @@ public class Reflect { return new Reflect(object); } + /** + * Conveniently render an {@link AccessibleObject} accessible + * + * @param accessible The object to render accessible + * @return The argument object rendered accessible + */ + public static T accessible(T accessible) { + if (accessible == null) { + return null; + } + + if (!accessible.isAccessible()) { + accessible.setAccessible(true); + } + + return accessible; + } + // --------------------------------------------------------------------- // Members // --------------------------------------------------------------------- @@ -139,12 +158,6 @@ public class Reflect { this.isClass = false; } - // --------------------------------------------------------------------- - // Fluent Configuration API - // --------------------------------------------------------------------- - - // TODO: Allow for accessing non-public members, methods, etc - // --------------------------------------------------------------------- // Fluent Reflection API // --------------------------------------------------------------------- @@ -181,27 +194,15 @@ public class Reflect { return this; } catch (Exception e1) { - boolean accessible = true; - Field field = null; // Try again, setting a non-public field try { - field = type().getDeclaredField(name); - accessible = field.isAccessible(); - if (!accessible) - field.setAccessible(true); - - field.set(object, unwrap(value)); + accessible(type().getDeclaredField(name)).set(object, unwrap(value)); return this; } catch (Exception e2) { throw new ReflectException(e2); } - finally { - if (field != null && !accessible) { - field.setAccessible(false); - } - } } } @@ -245,27 +246,14 @@ public class Reflect { return on(field.get(object)); } catch (Exception e1) { - Field field = null; - boolean accessible = true; // Try again, getting a non-public field try { - field = type().getDeclaredField(name); - accessible = field.isAccessible(); - - if (!accessible) - field.setAccessible(true); - - return on(field.get(object)); + return on(accessible(type().getDeclaredField(name)).get(object)); } catch (Exception e2) { throw new ReflectException(e2); } - finally { - if (field != null && !accessible) { - field.setAccessible(false); - } - } } } @@ -519,11 +507,8 @@ public class Reflect { * Wrap an object returned from a method */ private static Reflect on(Method method, Object object, Object... args) throws ReflectException { - boolean accessible = method.isAccessible(); - try { - if (!accessible) - method.setAccessible(true); + accessible(method); if (method.getReturnType() == void.class) { method.invoke(object, args); @@ -536,11 +521,6 @@ public class Reflect { catch (Exception e) { throw new ReflectException(e); } - finally { - if (!accessible) { - method.setAccessible(false); - } - } } /** diff --git a/jOOQ/src/main/java/org/jooq/tools/reflect/ReflectException.java b/jOOQ/src/main/java/org/jooq/tools/reflect/ReflectException.java index 966954cadf..bdabf761fa 100644 --- a/jOOQ/src/main/java/org/jooq/tools/reflect/ReflectException.java +++ b/jOOQ/src/main/java/org/jooq/tools/reflect/ReflectException.java @@ -1,5 +1,5 @@ /** - * Copyright (c) 2009-2012, Lukas Eder, lukas.eder@gmail.com + * Copyright (c) 2011-2012, Lukas Eder, lukas.eder@gmail.com * All rights reserved. * * This software is licensed to you under the Apache License, Version 2.0