Open
Description
Hi,
the following code, wich uses the FieldValueResolver
, leads to an InaccessibleObjectException
.
import com.github.jknack.handlebars.Context;
import com.github.jknack.handlebars.Handlebars;
import com.github.jknack.handlebars.context.FieldValueResolver;
import com.github.jknack.handlebars.io.FileTemplateLoader;
public final class Main {
public static void main(final String[] args) throws Throwable {
final var loader = new FileTemplateLoader(".", ".hbs");
final var handlebars = new Handlebars(loader);
final String str = handlebars.compile("foo").apply(
Context.newBuilder(null).resolver(FieldValueResolver.INSTANCE).build());
System.out.println(str);
}
}
Assuming that this code is in the file Main.java
and that, sitting next to it, the file foo.hbs
contains the following.
AAA{{> bar}}CCC
And that the file bar.hbs
contains the following.
BBB
Then the following command produces the exception.
$ java -version
openjdk version "17.0.1" 2021-10-19
OpenJDK Runtime Environment (build 17.0.1+12-Debian-1deb11u2)
OpenJDK 64-Bit Server VM (build 17.0.1+12-Debian-1deb11u2, mixed mode, sharing)
$ java -cp "./handlebars-4.3.0.jar:./slf4j-api-1.7.32.jar" Main.java
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Exception in thread "main" com.github.jknack.handlebars.HandlebarsException: ./foo.hbs:1:7: java.lang.IllegalStateException: Shouldn't be illegal to access field 'size'
./foo.hbs:1:7
at com.github.jknack.handlebars.context.FieldValueResolver.invokeMember(FieldValueResolver.java:217)
at com.github.jknack.handlebars.context.FieldValueResolver.invokeMember(FieldValueResolver.java:39)
at com.github.jknack.handlebars.context.MemberValueResolver.resolve(MemberValueResolver.java:59)
at com.github.jknack.handlebars.Context$CompositeValueResolver.resolve(Context.java:200)
at com.github.jknack.handlebars.internal.path.PropertyPath.eval(PropertyPath.java:52)
at com.github.jknack.handlebars.Context$PathExpressionChain.next(Context.java:361)
at com.github.jknack.handlebars.Context$PathExpressionChain.eval(Context.java:381)
at com.github.jknack.handlebars.Context.get(Context.java:621)
at com.github.jknack.handlebars.internal.Partial.override(Partial.java:253)
at com.github.jknack.handlebars.internal.Partial.merge(Partial.java:226)
at com.github.jknack.handlebars.internal.BaseTemplate.apply(BaseTemplate.java:126)
at com.github.jknack.handlebars.internal.TemplateList.merge(TemplateList.java:95)
at com.github.jknack.handlebars.internal.BaseTemplate.apply(BaseTemplate.java:126)
at com.github.jknack.handlebars.internal.BaseTemplate.apply(BaseTemplate.java:114)
at com.github.jknack.handlebars.internal.ForwardingTemplate.apply(ForwardingTemplate.java:100)
at Main.main(Main.java:11)
Caused by: java.lang.IllegalStateException: Shouldn't be illegal to access field 'size'
at com.github.jknack.handlebars.context.FieldValueResolver.invokeMember(FieldValueResolver.java:217)
at com.github.jknack.handlebars.context.FieldValueResolver.invokeMember(FieldValueResolver.java:39)
at com.github.jknack.handlebars.context.MemberValueResolver.resolve(MemberValueResolver.java:59)
at com.github.jknack.handlebars.Context$CompositeValueResolver.resolve(Context.java:200)
at com.github.jknack.handlebars.internal.path.PropertyPath.eval(PropertyPath.java:52)
at com.github.jknack.handlebars.Context$PathExpressionChain.next(Context.java:361)
at com.github.jknack.handlebars.Context$PathExpressionChain.eval(Context.java:381)
at com.github.jknack.handlebars.Context.get(Context.java:621)
at com.github.jknack.handlebars.internal.Partial.override(Partial.java:253)
at com.github.jknack.handlebars.internal.Partial.merge(Partial.java:226)
at com.github.jknack.handlebars.internal.BaseTemplate.apply(BaseTemplate.java:126)
at com.github.jknack.handlebars.internal.TemplateList.merge(TemplateList.java:95)
at com.github.jknack.handlebars.internal.BaseTemplate.apply(BaseTemplate.java:126)
at com.github.jknack.handlebars.internal.BaseTemplate.apply(BaseTemplate.java:114)
at com.github.jknack.handlebars.internal.ForwardingTemplate.apply(ForwardingTemplate.java:100)
at Main.main(Main.java:11)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at jdk.compiler/com.sun.tools.javac.launcher.Main.execute(Main.java:419)
at jdk.compiler/com.sun.tools.javac.launcher.Main.run(Main.java:192)
at jdk.compiler/com.sun.tools.javac.launcher.Main.main(Main.java:132)
Caused by: java.lang.IllegalAccessException: class com.github.jknack.handlebars.context.FieldValueResolver$FieldMembercannot access a member of class java.util.HashMap (in module java.base) with modifiers "transient"
at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:392)
at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:674)
at java.base/java.lang.reflect.Field.checkAccess(Field.java:1102)
at java.base/java.lang.reflect.Field.get(Field.java:423)
at com.github.jknack.handlebars.context.FieldValueResolver$FieldMember.get(FieldValueResolver.java:135)
at com.github.jknack.handlebars.context.FieldValueResolver.invokeMember(FieldValueResolver.java:214)
... 22 more