private final MethodHandle constructor;
private final MethodHandle setter;
+ private final T template;
- private StringValueObjectFactory(final MethodHandle constructor, final MethodHandle setter) {
- this.constructor = Preconditions.checkNotNull(constructor);
+ private StringValueObjectFactory(final T template, final MethodHandle constructor, final MethodHandle setter) {
+ this.template = Preconditions.checkNotNull(template);
+ this.constructor = constructor.bindTo(template);
this.setter = Preconditions.checkNotNull(setter);
}
final StringValueObjectFactory<T> ret;
try {
- ret = new StringValueObjectFactory<>(
- LOOKUP.unreflectConstructor(copyConstructor).asType(CONSTRUCTOR_METHOD_TYPE).bindTo(template),
+ ret = new StringValueObjectFactory<>(template,
+ LOOKUP.unreflectConstructor(copyConstructor).asType(CONSTRUCTOR_METHOD_TYPE),
LOOKUP.unreflectSetter(f).asType(SETTER_METHOD_TYPE));
} catch (IllegalAccessException e) {
throw new IllegalStateException("Failed to instantiate method handles", e);
// is far from perfect, but better than nothing.
final Throwable t = new Throwable("Invocation stack");
t.fillInStackTrace();
- if (matchesPackage(clazz.getPackage(), t.getStackTrace())) {
+ if (matchesPackage(clazz.getPackage().getName(), t.getStackTrace())) {
LOG.info("Instantiated factory for {}", clazz);
} else {
LOG.warn("Instantiated factory for {} outside its package", clazz, t);
return ret;
}
- private static boolean matchesPackage(final Package pkg, final StackTraceElement[] stackTrace) {
+ private static boolean matchesPackage(final String pkg, final StackTraceElement[] stackTrace) {
for (StackTraceElement e : stackTrace) {
- if (pkg.equals(e.getClass().getPackage())) {
+ final String sp = e.getClassName();
+ if (sp.startsWith(pkg) && sp.lastIndexOf('.') == pkg.length()) {
return true;
}
}
throw Throwables.propagate(e);
}
}
+
+ public T getTemplate() {
+ return template;
+ }
}