@Override protected void setupMapper(final Job job) { job.setMapperClass(IntermediateKeyValueMapper.class); final Class<?>[] genericClasses = GenericTypeResolver.resolveTypeArguments(ingestPlugin.getClass(), IngestWithReducer.class); // set mapper output info job.setMapOutputKeyClass(genericClasses[1]); job.setMapOutputValueClass(genericClasses[2]); }
/** * Resolve the single type argument of the given generic interface against the given target class * which is assumed to implement the generic interface and possibly declare a concrete type for * its type variable. * * @param clazz the target class to check against * @param genericIfc the generic interface or superclass to resolve the type argument from * @return the resolved type of the argument, or <code>null</code> if not resolvable */ public static Class<?> resolveTypeArgument(Class<?> clazz, Class<?> genericIfc) { Class<?>[] typeArgs = resolveTypeArguments(clazz, genericIfc); if (typeArgs == null) { return null; } if (typeArgs.length != 1) { throw new IllegalArgumentException( "Expected 1 type argument on generic interface [" + genericIfc.getName() + "] but found " + typeArgs.length); } return typeArgs[0]; }
GenericTypeResolver.resolveTypeArguments( indexHandler.getClass(), IndexFieldHandler.class)[1], GenericTypeResolver.resolveTypeArguments( defaultFieldHandler.getClass(), IndexFieldHandler.class)[1];