É possível criar instâncias sem chamar o construtor?

Ae pessoal,
Quero saber se é possível criar umas instância de uma classe (usando reflection ou qualquer outra coisa) sem chamar o construtor da mesma.

É que estou tendo um problema com o OC4J em que ele cria uma instância de uma tag e no construtor da tag eu seto um valor para um atributo. Da primeira vez que ele executa a página ele chama o construtor e seta o valor corretamente. Só que da segunda vez que eu executo a página dá um NullPointerException pq o maldito atributo está nulo.
Debugando eu vi que o OC4J cria um pool de tags e joga uma instância da tag nessa pool, só que com o maldito atributo nulo. Então da segunda vez que ele executa a página ele pega a instancia da pool e [color=red]PÃ![/color] NullPointer. Então parece que o construtor não está sendo chamado para criar essa instância.

É isso… Alguém tem alguma idéia?

Esqueça construtores quando o assunto for TAG.

Não é uma boa prática devido exatamente aos problema que vc vai ter com a otimização do web container. O container usa reflection para instanciar as tags (newInstance()) e usa SEMPRE o construtor sem parametros. Na maioria das vezes que vc estiver usando reflection, o construtor chamado será o sem parametros, keep that in mind. Por exemplo, todo bean do Hibernate precisa de um construtor sem parametros por causa de reflection.

Para iniciar um TAG use doStartTag.
Para finalizar um TAG use doEndTag.

Não esqueça de zerar todas as variáveis opcionais do seu tag em doEndTag, caso contrário da próxima vez que a instância for usada, os valores estarão lá independentes de terem sido passados ou não pelo tag.

Isso seria uma solução bacalhau !!! E não dá para fazer de qualquer jeito. Algum construtor vc vai ter que chamar…

Faça a coisa direito usando doStartTag e doEndTag! :wink:

Uma dica é ver o que outras pessoas costumam fazer. (Assim como o seu professor de português pedia para você ler livros e jornais, para que você pudesse aprender a escrever bem por imitação, eu peço a mesma coisa, só que com programas Java.)

Por exemplo, se você der uma olhada nos fontes das tag libraries do Struts, vai ver que ele sempre costuma efetuar o override do método “public void release()” (veja o javadoc de javax.servlet.jsp.tagext.TagSupport) , onde ele seta todas as variáveis de instância da classe para “null” ou para um valor conhecido, e se for o caso chama “super.release()” também.

Sem contar que ele nunca usa o construtor do objeto para fazer alguma coisa… Sempre faz em doStartTag.

Então…
Na verdade essas tags não são minhas, são algumas tags do myfaces.
Estou testando a compatibilidade com o OC4J e está dando esse problema. Eu já tinha encontrado o mesmo problema em outras tags, postei na lista de desenvolvimento e o pessoal alterou o código para funcionar no OC4J, só que encontrei outras tags que não foram alteradas e queria entender o pq do problema.
Achei estranho pq a inicialização do atributo está no construtor padrão (sem parâmetros) e mesmo assim o atributo não está sendo inicializado. Não sei se é um bug do OC4J mas vou procurar saber disso…
Valeu!

[quote=thingol]Por exemplo, se você der uma olhada nos fontes das tag libraries do Struts, vai ver que ele sempre costuma efetuar o override do método “public void release()” (veja o javadoc de javax.servlet.jsp.tagext.TagSupport) , onde ele seta todas as variáveis de instância da classe para “null” ou para um valor conhecido, e se for o caso chama “super.release()” também.
[/quote]

Ei, qdo eu li isso, fui correndo ver o release() da Super Class da tag no source do myfaces e lá estava ele… idConverter = null; (o atributo que é inicializado no construtor). E como o OC4J usa um pool para as tags ele não precisa criar outra instância, ou seja, não chama o construtor de novo, assim o idConverter fica null!
Vou postar isso na lista do myfaces e esperar eles alterarem igual as outras…

Valeu!

Acho que me enganei sobre isso. Parece que o container só reutiliza a mesma instância se os parametros forem os mesmos, isto é, vc não precisa resetar os atributos opcionais depois de usar o seu tag no doEndTag.

Se vc resetar os parametros opcionais, aí sim vc terá problemas, pois quando o container reutiliza os tags, os setAttributes não são chamados e vc vai acabar com um valor errado.

Eu pensei que os setAttributes eram sempre chamados, no matter what, mas pelo jeito não…