<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Jun 25, 2016 at 11:52 AM, Jan Vrany <span dir="ltr"><<a href="mailto:jan.vrany@fit.cvut.cz" target="_blank">jan.vrany@fit.cvut.cz</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><blockquote type="cite"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><br></div><div>In Java you *cannot* annotate any language element. You can annotate class, methods, instance variables, method arguments and temporaries and packages.</div></div></div></div></blockquote><div><br></div><blockquote type="cite"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div>Then when I take an annotation, for example an hibernate annotation:</div><div><pre style="font-family:Menlo,Monaco,Consolas,"Courier New",monospace;padding:5px;margin-top:0px;margin-bottom:10px;border-radius:0px;width:604px;line-height:16px;border:1px solid rgb(214,214,214);font-size:13px;overflow:auto;color:rgb(49,49,49);background-color:rgb(238,238,238)"><span style="color:rgb(0,102,102)">@Entity</span><span>
</span><span style="color:rgb(0,102,102)">@Table</span><span style="color:rgb(102,102,0)">(</span><span>name </span><span style="color:rgb(102,102,0)">=</span><span> </span><span style="color:rgb(0,136,0)">"EMPLOYEE"</span><span style="color:rgb(102,102,0)">)</span></pre>In the case of Hibernate, these annotation are for a class and they are used at *runtime* to bind the class instances with database entries (elements of this class are stored in the table EMPLOYEE).</div><div><br></div><div>Now I've never seen anyone doing that, but as you can access the annotation at runtime, and you can extract from the annotation its name and its parameters (for example you could extract "Table" and "name -> EMPLOYEE". Then, using the Java reflective features, you can do something like:</div><div><br></div><div><pre style="margin-top:0px;margin-bottom:1em;padding:5px;border:0px;font-size:13px;width:auto;max-height:600px;overflow:auto;font-family:Consolas,Menlo,Monaco,"Lucida Console","Liberation Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace,sans-serif;color:rgb(57,51,24);word-wrap:normal;background-color:rgb(239,240,241)"><code style="margin:0px;padding:0px;border:0px;font-family:Consolas,Menlo,Monaco,"Lucida Console","Liberation Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace,sans-serif;white-space:inherit"><span style="margin:0px;padding:0px;border:0px;color:rgb(48,51,54)">method </span><span style="margin:0px;padding:0px;border:0px;color:rgb(48,51,54)">=</span><span style="margin:0px;padding:0px;border:0px;color:rgb(48,51,54)"> obj</span><span style="margin:0px;padding:0px;border:0px;color:rgb(48,51,54)">.</span><span style="margin:0px;padding:0px;border:0px;color:rgb(48,51,54)">getClass</span><span style="margin:0px;padding:0px;border:0px;color:rgb(48,51,54)">().</span><span style="margin:0px;padding:0px;border:0px;color:rgb(48,51,54)">getMethod</span><span style="margin:0px;padding:0px;border:0px;color:rgb(48,51,54)">(</span><span style="margin:0px;padding:0px;border:0px;color:rgb(48,51,54)">methodName</span><span style="margin:0px;padding:0px;border:0px;color:rgb(48,51,54)">,</span><span style="margin:0px;padding:0px;border:0px;color:rgb(48,51,54)"> param1</span><span style="margin:0px;padding:0px;border:0px;color:rgb(48,51,54)">.</span><span style="margin:0px;padding:0px;border:0px;color:rgb(16,16,148)">class</span><span style="margin:0px;padding:0px;border:0px;color:rgb(48,51,54)">,</span><span style="margin:0px;padding:0px;border:0px;color:rgb(48,51,54)"> param2</span><span style="margin:0px;padding:0px;border:0px;color:rgb(48,51,54)">.</span><span style="margin:0px;padding:0px;border:0px;color:rgb(16,16,148)">class</span><span style="margin:0px;padding:0px;border:0px;color:rgb(48,51,54)">,</span><span style="margin:0px;padding:0px;border:0px;color:rgb(48,51,54)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(48,51,54)">..);</span></code></pre><pre style="margin-top:0px;margin-bottom:1em;padding:5px;border:0px;font-size:13px;width:auto;max-height:600px;overflow:auto;font-family:Consolas,Menlo,Monaco,"Lucida Console","Liberation Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace,sans-serif;color:rgb(57,51,24);word-wrap:normal;background-color:rgb(239,240,241)"><span style="white-space:inherit;margin:0px;padding:0px;border:0px;color:rgb(48,51,54)">method</span><span style="white-space:inherit;margin:0px;padding:0px;border:0px;color:rgb(48,51,54)">.</span><span style="white-space:inherit;margin:0px;padding:0px;border:0px;color:rgb(48,51,54)">invoke</span><span style="white-space:inherit;margin:0px;padding:0px;border:0px;color:rgb(48,51,54)">(</span><span style="white-space:inherit;margin:0px;padding:0px;border:0px;color:rgb(48,51,54)">obj</span><span style="white-space:inherit;margin:0px;padding:0px;border:0px;color:rgb(48,51,54)">,</span><span style="white-space:inherit;margin:0px;padding:0px;border:0px;color:rgb(48,51,54)"> arg1</span><span style="white-space:inherit;margin:0px;padding:0px;border:0px;color:rgb(48,51,54)">,</span><span style="white-space:inherit;margin:0px;padding:0px;border:0px;color:rgb(48,51,54)"> arg2</span><span style="white-space:inherit;margin:0px;padding:0px;border:0px;color:rgb(48,51,54)">,...);</span></pre>And this way you execute a method named "Table", "name" or "EMPLOYEE" with the parameter you want, as you could execute a method from any string matching a method name. We have the same primitive in Pharo on CompiledMethod.</div><div><br></div><div><br></div><div>I would not say that pragmas are more powerful in Java. Can you give an example of something you can do with the Java annotation that you can't do with Pharo pragmas ?</div></div></div></div></blockquote><div><br></div></span><div>Out of a curiosity,  how can I annotate class, instance variable, method argument or temporary, or package. </div><div>How can I annotate the pragma definition itself? How can I retrieve annotations of a pragma definition? </div><div><br></div><div>I mean, I understand that you can *achieve* same effect, but you *can* achieve it as well with no pragma support at all.</div></blockquote><div><br></div><div>Agreed. We can do the same thing, but we do it differently.</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="HOEnZb"><font color="#888888"><div><br></div><div>Jan</div></font></span><div class="HOEnZb"><div class="h5"><br><blockquote type="cite"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div>In Slang we use pragma to annotate argument and temporary variables and it works just fine. When you describe in Pharo classes and instance variables using Magritte you can do the same thing as just annotating them. </div><div><br></div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
Stef<br>
<br>
</blockquote></div><br></div></div>
</blockquote></div></div></blockquote></div><br></div></div>