| \begin{figure}[t!] |
| |
| % Column definitions to control alignment and width |
| %\newcolumntype{L}[1]{>{\raggedright\let\newline\\\arraybackslash\hspace{0pt}}m{#1}} |
| %\newcolumntype{C}[1]{>{\centering\let\newline\\\arraybackslash\hspace{0pt}}m{#1}} |
| |
| \begin{center} |
| \begin{small} |
| %BEGIN IMAGE |
| \def\ruleHeader#1{\framebox[.4\linewidth]{#1}} |
| \def\text#1{\textrm{#1}} |
| \def\sym#1{\textit{#1}} |
| \newcommand{\inferred}[2][\relax]{\textbf{#2\<(>}#1\textbf{\<)>}} |
| \newcommand{\breakabledot}{\discretionary{}{.}{.}} |
| |
| \newcommand{\const}{\text{ is a compile-time constant string }} |
| \newcommand{\condspace}{\quad} |
| \newcommand{\halfcondspace}{\ } |
| |
| \def\forName{\<Class.forName>} |
| \def\loadClass{\<ClassLoader.loadClass>} |
| |
| \begin{tabular}{c} |
| %\ruleHeader{Inference of \textbf{\<@ClassVal>}} \\[\gap] |
| \infer{\<C.class> : \inferred[bn]{\<@ClassVal>}} |
| {\sym{bn}\text{ is the binary name of }\<C>} \\ |
| \\ |
| \infer{\<Class.forName(>s\<)>: \inferred[\nu]{\<@ClassVal>}} |
| {s: \<@StringVal(>\nu\<)>} \\ |
| \\[4pt] |
| %\ruleHeader{Inference of \textbf{\<@ClassBound>}}\\[\gap] |
| \infer{e\<.getClass()> : \inferred[bn]{\<@ClassBound>}} |
| {e: \tau \condspace \sym{bn}\text{ is the binary name of }\tau} \\ |
| \\[4pt] |
| %\ruleHeader{Inference of \textbf{\<@MethodVal>}} \\[\gap] |
| \infer{e\<.getMethod(>s\<,>p\<)> : \inferred[\<cn=>\nu\<,mn=>\mu\<,np=>\pi]{\<@MethodVal>}} |
| {(e: \<@ClassBound(>\nu\<)> \halfcondspace \vee \halfcondspace e: \<@ClassVal(>\nu\<)>) |
| \\ s:\<@StringVal(>\mu\<)> \condspace p: \<@ArrayLen(>\pi\<)>} \\ |
| \\ |
| \infer{e\<.getConstructor(>p\<)> : \inferred[\<cn=>\nu,mn=\code{"<init>"},np=\pi]{\<@MethodVal>}} |
| {e: \<@ClassVal(>\nu\<)> \condspace p: \<@ArrayLen(>\pi\<)>} \\ |
| |
| \end{tabular} |
| %END IMAGE |
| %HEVEA\imageflush |
| \end{small} |
| \end{center} |
| \caption{\label{fig:reflection-inference}% |
| Example inference rules for @ClassVal, @ClassBound, and @MethodVal. |
| Additional rules exist for expressions with similar semantics but that call |
| methods with different names or signatures. |
| %\todo{I added more examples and a more detailed description to the section, so |
| % this does not seem to be necessary here: (e.g., @ClassVal is also inferred for |
| %calls to \<ClassLoader.loadClass>).} |
| } |
| \end{figure} |