Re: Generics: instantiating an object from a class name in configuration
 
On 10.07.2010 02:54, markspace wrote:
Lew wrote:
try
{
// ClassCastException caught so this is safe
@SuppressWarnings( "unchecked" )
Class <Authenticator> clazz =
(Class <Authenticator>) Class.forName( name );
authenticator = clazz.newInstance();
}
The following doesn't generate any warning messages and doesn't require
a @SuppressWarnings annotation. It's also a tad shorter. It will throw
ClassCastException if the type loaded isn't right, but that could be
caught too. I'm not sure it's better, but it is an alternative.
try
{
Class<?> c = Class.forName( "test" );
SomeType s = (SomeType) c.newInstance();
} catch( InstantiationException ex ) { ... // etc.
This is even better because you don't even need a cast:
   public static Authenticator create1(String className) throws 
CreationException {
     try {
       final Class<? extends Authenticator> cl = 
Class.forName(className).asSubclass(Authenticator.class);
       return cl.newInstance();
     } catch (ClassNotFoundException e) {
       throw new CreationException("Class not found: " + className, e);
     } catch (InstantiationException e) {
       throw new CreationException("Could not create instance: " + 
className, e);
     } catch (IllegalAccessException e) {
       throw new CreationException("Operation not permitted", e);
     }
   }
You can even pack it in one line and it doesn't look too ugly:
   public static Authenticator create2(String className) throws 
CreationException {
     try {
       return 
Class.forName(className).asSubclass(Authenticator.class).newInstance();
     } catch (ClassNotFoundException e) {
       throw new CreationException("Class not found: " + className, e);
     } catch (InstantiationException e) {
       throw new CreationException("Could not create instance: " + 
className, e);
     } catch (IllegalAccessException e) {
       throw new CreationException("Operation not permitted", e);
     }
   }
Kind regards
    robert
-- 
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/