diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index ca52aa8169..83763ca51b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -423,6 +423,7 @@ import org.jooq.QualifiedAsterisk; import org.jooq.Queries; import org.jooq.Query; import org.jooq.QueryPart; +import org.jooq.QueryPartInternal; import org.jooq.Record; import org.jooq.ResultQuery; import org.jooq.RevokeFromStep; @@ -10351,8 +10352,8 @@ final class ParserImpl implements Parser { "FOR" }; - private static final DDLQuery IGNORE = Reflect.on(DSL.query("/* ignored */")).as(DDLQuery.class); - private static final Query IGNORE_NO_DELIMITER = Reflect.on(DSL.query("/* ignored */")).as(Query.class); + private static final DDLQuery IGNORE = Reflect.on(DSL.query("/* ignored */")).as(DDLQuery.class, QueryPartInternal.class); + private static final Query IGNORE_NO_DELIMITER = Reflect.on(DSL.query("/* ignored */")).as(Query.class, QueryPartInternal.class); } final class ParserContext { 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 1339ea16ac..b87c76f001 100644 --- a/jOOQ/src/main/java/org/jooq/tools/reflect/Reflect.java +++ b/jOOQ/src/main/java/org/jooq/tools/reflect/Reflect.java @@ -99,7 +99,7 @@ public class Reflect { * @throws ReflectException if anything went wrong compiling the class. */ public static Reflect compile(String name, String content, CompileOptions options) throws ReflectException { - return on(Compile.compile(name, content, options)); + return onClass(Compile.compile(name, content, options)); } @@ -111,10 +111,12 @@ public class Reflect { * @param name A fully qualified class name * @return A wrapped class object, to be used for further reflection. * @throws ReflectException If any reflection exception occurred. - * @see #on(Class) + * @see #onClass(Class) + * @deprecated [#78] 0.9.11, use {@link #onClass(String)} instead. */ + @Deprecated public static Reflect on(String name) throws ReflectException { - return on(forName(name)); + return onClass(name); } /** @@ -128,10 +130,59 @@ public class Reflect { * loaded. * @return A wrapped class object, to be used for further reflection. * @throws ReflectException If any reflection exception occurred. - * @see #on(Class) + * @see #onClass(Class) + * @deprecated [#78] 0.9.11, use {@link #onClass(String, ClassLoader)} instead. */ + @Deprecated public static Reflect on(String name, ClassLoader classLoader) throws ReflectException { - return on(forName(name, classLoader)); + return onClass(name, classLoader); + } + + /** + * Wrap a class. + *
+ * Use this when you want to access static fields and methods on a + * {@link Class} object, or as a basis for constructing objects of that + * class using {@link #create(Object...)} + * + * @param clazz The class to be wrapped + * @return A wrapped class object, to be used for further reflection. + * @deprecated [#78] 0.9.11, use {@link #onClass(Class)} instead. + */ + @Deprecated + public static Reflect on(Class> clazz) { + return onClass(clazz); + } + + /** + * Wrap a class name. + *
+ * This is the same as calling onClass(Class.forName(name))
+ *
+ * @param name A fully qualified class name
+ * @return A wrapped class object, to be used for further reflection.
+ * @throws ReflectException If any reflection exception occurred.
+ * @see #onClass(Class)
+ */
+ public static Reflect onClass(String name) throws ReflectException {
+ return onClass(forName(name));
+ }
+
+ /**
+ * Wrap a class name, loading it via a given class loader.
+ *
+ * This is the same as calling
+ * onClass(Class.forName(name, classLoader))
+ *
+ * @param name A fully qualified class name.
+ * @param classLoader The class loader in whose context the class should be
+ * loaded.
+ * @return A wrapped class object, to be used for further reflection.
+ * @throws ReflectException If any reflection exception occurred.
+ * @see #onClass(Class)
+ */
+ public static Reflect onClass(String name, ClassLoader classLoader) throws ReflectException {
+ return onClass(forName(name, classLoader));
}
/**
@@ -144,7 +195,7 @@ public class Reflect {
* @param clazz The class to be wrapped
* @return A wrapped class object, to be used for further reflection.
*/
- public static Reflect on(Class> clazz) {
+ public static Reflect onClass(Class> clazz) {
return new Reflect(clazz);
}
@@ -661,18 +712,31 @@ public class Reflect {
}
/**
- * Create a proxy for the wrapped object allowing to typesafely invoke
- * methods on it using a custom interface
+ * Create a proxy for the wrapped object allowing to typesafely invoke methods
+ * on it using a custom interface.
*
* @param proxyType The interface type that is implemented by the proxy
* @return A proxy for the wrapped object
*/
+ public
P as(Class
proxyType) { + return as(proxyType, new Class[0]); + } + + /** + * Create a proxy for the wrapped object allowing to typesafely invoke methods + * on it using a custom interface. + * + * @param proxyType The interface type that is implemented by the + * proxy + * @param additionalInterfaces Additional interfaces that are implemented by the + * proxy + * @return A proxy for the wrapped object + */ @SuppressWarnings("unchecked") - public
P as(final Class
proxyType) { + public
P as(final Class
proxyType, final Class>... additionalInterfaces) { final boolean isMap = (object instanceof Map); final InvocationHandler handler = new InvocationHandler() { @Override - @SuppressWarnings("null") public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String name = method.getName(); @@ -728,7 +792,10 @@ public class Reflect { } }; - return (P) Proxy.newProxyInstance(proxyType.getClassLoader(), new Class[] { proxyType }, handler); + Class>[] interfaces = new Class[1 + additionalInterfaces.length]; + interfaces[0] = proxyType; + System.arraycopy(additionalInterfaces, 0, interfaces, 1, additionalInterfaces.length); + return (P) Proxy.newProxyInstance(proxyType.getClassLoader(), interfaces, handler); } /**