/** * Returns a generated constructor for a {@link DoFnInvoker} for the given {@link DoFn} class. * * <p>These are cached such that at most one {@link DoFnInvoker} class exists for a given {@link * DoFn} class. */ private synchronized Constructor<?> getByteBuddyInvokerConstructor(DoFnSignature signature) { Class<? extends DoFn<?, ?>> fnClass = signature.fnClass(); Constructor<?> constructor = byteBuddyInvokerConstructorCache.get(fnClass); if (constructor == null) { Class<? extends DoFnInvoker<?, ?>> invokerClass = generateInvokerClass(signature); try { constructor = invokerClass.getConstructor(fnClass); } catch (IllegalArgumentException | NoSuchMethodException | SecurityException e) { throw new RuntimeException(e); } byteBuddyInvokerConstructorCache.put(fnClass, constructor); } return constructor; }
@Override public Constructor<?> load(final OnTimerMethodSpecifier onTimerMethodSpecifier) throws Exception { DoFnSignature signature = DoFnSignatures.getSignature(onTimerMethodSpecifier.fnClass()); Class<? extends OnTimerInvoker<?, ?>> invokerClass = generateOnTimerInvokerClass(signature, onTimerMethodSpecifier.timerId()); try { return invokerClass.getConstructor(signature.fnClass()); } catch (IllegalArgumentException | NoSuchMethodException | SecurityException e) { throw new RuntimeException(e); } } });
/** @return the {@link DoFnInvoker} for the given {@link DoFn}. */ public <InputT, OutputT> DoFnInvoker<InputT, OutputT> newByteBuddyInvoker( DoFnSignature signature, DoFn<InputT, OutputT> fn) { checkArgument( signature.fnClass().equals(fn.getClass()), "Signature is for class %s, but fn is of class %s", signature.fnClass(), fn.getClass()); try { @SuppressWarnings("unchecked") DoFnInvokerBase<InputT, OutputT, DoFn<InputT, OutputT>> invoker = (DoFnInvokerBase<InputT, OutputT, DoFn<InputT, OutputT>>) getByteBuddyInvokerConstructor(signature).newInstance(fn); for (OnTimerMethod onTimerMethod : signature.onTimerMethods().values()) { invoker.addOnTimerInvoker( onTimerMethod.id(), OnTimerInvokers.forTimer(fn, onTimerMethod.id())); } return invoker; } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | SecurityException e) { throw new RuntimeException("Unable to bind invoker for " + fn.getClass(), e); } }
Class<? extends DoFn<?, ?>> fnClass = signature.fnClass();
Class<? extends DoFn<?, ?>> fnClass = signature.fnClass();