Applied thanx ! Mvgr, Martin
On Mon, 2003-02-03 at 20:58, LOX wrote: > here we go again... > ---- > > Index: ConstructorUtils.java > =================================================================== > RCS file: >/home/cvspublic/jakarta-commons/beanutils/src/java/org/apache/commons/beanutils/ConstructorUtils.java,v > retrieving revision 1.2 > diff -u -r1.2 ConstructorUtils.java > --- ConstructorUtils.java 15 Jan 2003 21:59:38 -0000 1.2 > +++ ConstructorUtils.java 3 Feb 2003 14:38:06 -0000 > @@ -63,6 +63,21 @@ > > /** > * @version $Revision: 1.2 $ $Date: 2003/01/15 21:59:38 $ > + * > + * <p> Utility reflection methods focussed on constructors, modelled after {@link >MethodUtils}. </p> > + * > + * <h3>Known Limitations</h3> > + * <h4>Accessing Public Constructors In A Default Access Superclass</h4> > + * <p>There is an issue when invoking public constructors contained in a default >access superclass. > + * Reflection locates these constructors fine and correctly assigns them as public. > + * However, an <code>IllegalAccessException</code> is thrown if the constructors is >invoked.</p> > + * > + * <p><code>ConstructorUtils</code> contains a workaround for this situation. > + * It will attempt to call <code>setAccessible</code> on this constructor. > + * If this call succeeds, then the method can be invoked as normal. > + * This call will only succeed when the application has sufficient security >privilages. > + * If this call fails then a warning will be logged and the method may fail.</p> > + * > * @author Craig R. McClanahan > * @author Ralph Schaer > * @author Chris Audley > @@ -82,6 +97,19 @@ > > // --------------------------------------------------------- Public Methods > > + /** > + * <p>Convenience method returning new instance of <code>klazz</code> using a >single argument constructor. > + * The formal parameter type is inferred from the actual values of ><code>arg</code>. > + * See {@link #invokeExactConstructor(Class, Object[], Class[])} for more >details.</p> > + * > + * <p>The signatures should be assignment compatible.</p> > + * > + * @param klass the class to be constructed. > + * @param arg the actual argument > + * @return new instance of <code>klazz</code> > + * > + * @see #invokeConstructor(java.lang.Class, java.lang.Object[], >java.lang.Class[]) > + */ > public static Object invokeConstructor(Class klass, Object arg) > throws > NoSuchMethodException, > @@ -94,6 +122,19 @@ > > } > > + /** > + * <p>Returns new instance of <code>klazz</code> created using the actual >arguments <code>args</code>. > + * The formal parameter types are inferred from the actual values of ><code>args</code>. > + * See {@link #invokeExactConstructor(Class, Object[], Class[])} for more >details.</p> > + * > + * <p>The signatures should be assignment compatible.</p> > + * > + * @param klass the class to be constructed. > + * @param args actual argument array > + * @return new instance of <code>klazz</code> > + * > + * @see #invokeConstructor(java.lang.Class, java.lang.Object[], >java.lang.Class[]) > + */ > public static Object invokeConstructor(Class klass, Object[] args) > throws > NoSuchMethodException, > @@ -113,6 +154,23 @@ > > } > > + /** > + * <p>Returns new instance of <code>klazz</code> created using constructor > + * with signature <code>parameterTypes</code> and actual arguments ><code>args</code>.</p> > + * > + * <p>The signatures should be assignment compatible.</p> > + * > + * @param klass the class to be constructed. > + * @param args actual argument array > + * @param parameterTypes parameter types array > + * @return new instance of <code>klazz</code> > + * > + * @throws NoSuchMethodException if matching constructor cannot be found > + * @throws IllegalAccessException thrown on the constructor's invocation > + * @throws InvocationTargetException thrown on the constructor's invocation > + * @throws InstantiationException thrown on the constructor's invocation > + * @see Constructor#newInstance > + */ > public static Object invokeConstructor( > Class klass, > Object[] args, > @@ -139,6 +197,20 @@ > return ctor.newInstance(args); > } > > + > + /** > + * <p>Convenience method returning new instance of <code>klazz</code> using a >single argument constructor. > + * The formal parameter type is inferred from the actual values of ><code>arg</code>. > + * See {@link #invokeExactConstructor(Class, Object[], Class[])} for more >details.</p> > + * > + * <p>The signatures should match exactly.</p> > + * > + * @param klass the class to be constructed. > + * @param arg the actual argument > + * @return new instance of <code>klazz</code> > + * > + * @see #invokeExactConstructor(java.lang.Class, java.lang.Object[], >java.lang.Class[]) > + */ > public static Object invokeExactConstructor(Class klass, Object arg) > throws > NoSuchMethodException, > @@ -150,6 +222,20 @@ > return invokeExactConstructor(klass, args); > > } > + > + /** > + * <p>Returns new instance of <code>klazz</code> created using the actual >arguments <code>args</code>. > + * The formal parameter types are inferred from the actual values of ><code>args</code>. > + * See {@link #invokeExactConstructor(Class, Object[], Class[])} for more >details.</p> > + * > + * <p>The signatures should match exactly.</p> > + * > + * @param klass the class to be constructed. > + * @param args actual argument array > + * @return new instance of <code>klazz</code> > + * > + * @see #invokeExactConstructor(java.lang.Class, java.lang.Object[], >java.lang.Class[]) > + */ > public static Object invokeExactConstructor(Class klass, Object[] args) > throws > NoSuchMethodException, > @@ -168,6 +254,24 @@ > > } > > + /** > + * <p>Returns new instance of <code>klazz</code> created using constructor > + * with signature <code>parameterTypes</code> and actual arguments > + * <code>args</code>.</p> > + * > + * <p>The signatures should match exactly.</p> > + * > + * @param klass the class to be constructed. > + * @param args actual argument array > + * @param parameterTypes parameter types array > + * @return new instance of <code>klazz</code> > + * > + * @throws NoSuchMethodException if matching constructor cannot be found > + * @throws IllegalAccessException thrown on the constructor's invocation > + * @throws InvocationTargetException thrown on the constructor's invocation > + * @throws InstantiationException thrown on the constructor's invocation > + * @see Constructor#newInstance > + */ > public static Object invokeExactConstructor( > Class klass, > Object[] args, > @@ -195,6 +299,13 @@ > > } > > + /** > + * Returns a constructor with single argument. > + * @param klass the class to be constructed > + * @return null if matching accessible constructor can not be found. > + * @see Class#getConstructor > + * @see #getAccessibleConstructor(java.lang.reflect.Constructor) > + */ > public static Constructor getAccessibleConstructor( > Class klass, > Class parameterType) { > @@ -204,6 +315,14 @@ > > } > > + /** > + * Returns a constructor given a class and signature. > + * @param klass the class to be constructed > + * @param parameterTypes the parameter array > + * @return null if matching accessible constructor can not be found > + * @see Class#getConstructor > + * @see #getAccessibleConstructor(java.lang.reflect.Constructor) > + */ > public static Constructor getAccessibleConstructor( > Class klass, > Class[] parameterTypes) { > @@ -217,6 +336,12 @@ > > } > > + /** > + * Returns accessible version of the given constructor. > + * @param ctor prototype constructor object. > + * @return <code>null</code> if accessible constructor can not be found. > + * @see java.lang.SecurityManager > + */ > public static Constructor getAccessibleConstructor(Constructor ctor) { > > // Make sure we have a method to check > @@ -241,7 +366,21 @@ > } > > // -------------------------------------------------------- Private Methods > - > + /** > + * <p>Find an accessible constructor with compatible parameters. > + * Compatible parameters mean that every method parameter is assignable from > + * the given parameters. In other words, it finds constructor that will take > + * the parameters given.</p> > + * > + * <p>First it checks if there is constructor matching the exact signature. > + * If no such, all the constructors of the class are tested if their signatures > + * are assignment compatible with the parameter types. > + * The first matching constructor is returned.</p> > + * > + * @param clazz find constructor for this class > + * @param parameterTypes find method with compatible parameters > + * @return a valid Constructor object. If there's no matching constructor, >returns <code>null</code>. > + */ > private static Constructor getMatchingAccessibleConstructor( > Class clazz, > Class[] parameterTypes) { > > ---- > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]