Re: Annotations processing + type introspection + code generation
On Sep 12, 10:21 pm, Robert Klemme <shortcut...@googlemail.com> wrote:
On 12.09.2011 20:00, Alex J wrote:
On Sep 12, 8:56 pm, Robert Klemme<shortcut...@googlemail.com> wrote:
[snip]
Why do you want to generate code? I mean, you could process annotat=
ions
at runtime. Create appropriate classes for the handling and configu=
re
appropriate graphs of objects which do the work (or even use reflectio=
n).
I need to generate *source* code, the boilerplate code is complex
enough, unfortunately bytecode is not an option.
One of the reason why I need generated code is that the boilerplate
code is quite sofisticated, learning generated docs and debugging the
generated code most likely will be required.
There are other reasons, but I think that this one would be
sufficient.
Hm... If you need to generate a lot identical code there is something
wrong: that identical code could be better implemented directly and
used. So that leaves adapters and stuff Mark mentioned for generation.
I am not convinced yet that it is a good idea to generate loads of
complex code.
Can you shed some more light on the nature of the application you are
going to implement?
Yes, that's a prototype of tool that helps to implement a part of code
for you.
You (as a user) define interface, the tool tries to guess what you
want based on the name patterns, references to domain objects, etc.
Say you have the following:
@Specification // tells tool "this interface is a subject to be
processed"
interface PersonDao {
long savePerson(String name, int age);
Person getPerson(long id);
List<Long> getPersons();
}
interface Person {
String getName();
int getAge();
}
Then tool defines final class PersonDaoImpl and PersonImpl:
final class PersonDaoImpl implements PersonDao {
private static final class PersonImpl extends JdbcDaoSupport
implements Person {
private final String name;
private final int age;
PersonImpl(String name, int age) { this.name = name; this.age =
age; }
@Override public String getName() { return name; }
@Override public int getAge() { return age; }
}
@Override public long savePerson(String name, int age) {
getJdbcTemplate().update("INSERT INTO person (name, age) VALUES
(?, ?)", name, age);
return getJdbcTemplate.queryForInt("CALL identity()");
}
//.. etc.
}
This is not that simple as I gave above (as much more complex human-
friendly definitions might be involved), but this clearly describes
the idea.
I'm implementing this out of pure interest, as my hobby project :)
Kind regards
robert
--
remember.guy do |as, often| as.you_can - without endhttp://blog.rubybestp=
ractices.com/