<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt-BR">
	<id>https://wiki.rodrigogml.eng.br/index.php?action=history&amp;feed=atom&amp;title=MetaObject</id>
	<title>MetaObject - Histórico de revisão</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.rodrigogml.eng.br/index.php?action=history&amp;feed=atom&amp;title=MetaObject"/>
	<link rel="alternate" type="text/html" href="https://wiki.rodrigogml.eng.br/index.php?title=MetaObject&amp;action=history"/>
	<updated>2026-05-06T13:22:41Z</updated>
	<subtitle>Histórico de revisões para esta página neste wiki</subtitle>
	<generator>MediaWiki 1.37.0</generator>
	<entry>
		<id>https://wiki.rodrigogml.eng.br/index.php?title=MetaObject&amp;diff=26&amp;oldid=prev</id>
		<title>Rodrigogml: /* Constantes Vs. Métodos */</title>
		<link rel="alternate" type="text/html" href="https://wiki.rodrigogml.eng.br/index.php?title=MetaObject&amp;diff=26&amp;oldid=prev"/>
		<updated>2022-11-17T15:55:40Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Constantes Vs. Métodos&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;pt-BR&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Edição anterior&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Edição das 15h55min de 17 de novembro de 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l45&quot;&gt;Linha 45:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linha 45:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Para evitar que o MetaObject seja instanciado o tempo todo, cada Meta Object tem uma constante chamada &amp;quot;VO&amp;quot; que carrega uma instância estática do objeto. A maneira correta de utilizar o MetaObject seria a seguinte (de acordo com o exemplo de PersonVO citado acima):&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Para evitar que o MetaObject seja instanciado o tempo todo, cada Meta Object tem uma constante chamada &amp;quot;VO&amp;quot; que carrega uma instância estática do objeto. A maneira correta de utilizar o MetaObject seria a seguinte (de acordo com o exemplo de PersonVO citado acima):&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{java|Utilização do MetaObject por Métodos|&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{java|Utilização do MetaObject por Métodos|&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;PersonVO_.VO.fullName() //Retorna a String &amp;quot;fullName&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;PersonVO_.VO.fullName() //Retorna a String &amp;quot;fullName&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;PersonVO_.VO.parent().path() //Retorna a String &amp;quot;parent&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;PersonVO_.VO.parent().path() //Retorna a String &amp;quot;parent&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;PersonVO_.VO.parent().fullName() //Retorna a String &amp;quot;parent.fullName&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;PersonVO_.VO.parent().fullName() //Retorna a String &amp;quot;parent.fullName&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/syntaxhighlight&amp;gt;}}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;A sintaxe citada acima é que é definida por métodos. É a melhor e mais simples maneira de se referenciar os atributos ou suas cadeiras de atributos.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;A sintaxe citada acima é que é definida por métodos. É a melhor e mais simples maneira de se referenciar os atributos ou suas cadeiras de atributos.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
	<entry>
		<id>https://wiki.rodrigogml.eng.br/index.php?title=MetaObject&amp;diff=22&amp;oldid=prev</id>
		<title>Rodrigogml: Criou página com &#039;Meta Object é o &#039;&#039;&#039;Objeto do Objeto&#039;&#039;&#039;! Mais fácil que isso só dois disso!!! Se não entendeu continue lendo...  A definição de &#039;Meta Dados&#039; é &quot;A informação da Informação&quot;. Por exemplo, se você tem a informação do tipo texto &quot;Eu amo o RFW&quot;. Essa informação contém outras informações, como &quot;tamanho&quot;, &quot;charset&quot;, &quot;língua&quot;, etc.. Essas informações (dados) da própria informação são chamadas de &#039;Meta Dados&#039;.  De forma similar o RFW tem seus &#039;Meta Object...&#039;</title>
		<link rel="alternate" type="text/html" href="https://wiki.rodrigogml.eng.br/index.php?title=MetaObject&amp;diff=22&amp;oldid=prev"/>
		<updated>2022-11-17T15:39:47Z</updated>

		<summary type="html">&lt;p&gt;Criou página com &amp;#039;Meta Object é o &amp;#039;&amp;#039;&amp;#039;Objeto do Objeto&amp;#039;&amp;#039;&amp;#039;! Mais fácil que isso só dois disso!!! Se não entendeu continue lendo...  A definição de &amp;#039;Meta Dados&amp;#039; é &amp;quot;A informação da Informação&amp;quot;. Por exemplo, se você tem a informação do tipo texto &amp;quot;Eu amo o RFW&amp;quot;. Essa informação contém outras informações, como &amp;quot;tamanho&amp;quot;, &amp;quot;charset&amp;quot;, &amp;quot;língua&amp;quot;, etc.. Essas informações (dados) da própria informação são chamadas de &amp;#039;Meta Dados&amp;#039;.  De forma similar o RFW tem seus &amp;#039;Meta Object...&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Meta Object é o &amp;#039;&amp;#039;&amp;#039;Objeto do Objeto&amp;#039;&amp;#039;&amp;#039;! Mais fácil que isso só dois disso!!! Se não entendeu continue lendo...&lt;br /&gt;
&lt;br /&gt;
A definição de &amp;#039;Meta Dados&amp;#039; é &amp;quot;A informação da Informação&amp;quot;. Por exemplo, se você tem a informação do tipo texto &amp;quot;Eu amo o RFW&amp;quot;. Essa informação contém outras informações, como &amp;quot;tamanho&amp;quot;, &amp;quot;charset&amp;quot;, &amp;quot;língua&amp;quot;, etc.. Essas informações (dados) da própria informação são chamadas de &amp;#039;Meta Dados&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
De forma similar o RFW tem seus &amp;#039;Meta Objects&amp;#039;, que tem a finalidade de descrever seus próprios objetos. No caso, são utilizados para descrever cada um dos RFWVO do sistema.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Problema =&lt;br /&gt;
&lt;br /&gt;
Em várias partes do RFW há processos automatizados com métodos que tratam as classes RFWVO (ou suas herdeiras), no entanto sua implementação não conhece especificamente cada objeto. É possível orientá-lo a obter o atributo correto a partir de uma String de parâmetros.&lt;br /&gt;
&lt;br /&gt;
Por exemplo, imagine que estamos montando um relatório de clientes. Os dados seriam uma coleção de PersonVO. Para montar o relatório queremos que o Framework crie uma coluna com o atributo &amp;quot;fullName&amp;quot;. E que dentro de PersonVO, temos a referência para outro PersonVO que indica seu pai, no atributo &amp;quot;dad&amp;quot;. E queremos outra coluna com o nome completo do pai.&lt;br /&gt;
&lt;br /&gt;
Ao passar os caminhos para o framework por String seriam &amp;quot;fullName&amp;quot; e &amp;quot;parent.fullName&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;O problema&amp;#039;&amp;#039;&amp;#039; de passar por String é que se o atributo deixar de existir ou qualquer alteração/refactory que mude o atributo, ou ainda qualquer tipo de erro de digitação, fará com que o código compile normalmente mas não funcione. E mesmo que ele seja testado na hora, alterações futuras podem fazer com que o código deixe de funcionar em outras partes do sistema. Tupo por não haver validação dos atributos dentro da String.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Para resolver isso existe o MetaObject.&amp;#039;&amp;#039;&amp;#039; O Meta object é um objeto espelho do VO, que descreve o VO e seus métodos e atributos. De forma que ele monta a String a ser passada somente durante o RunTime. Durante o tempo de compilação ele mantém métodos que deixam de existir caso o atributo deixe de existir. O que fará com que o código &amp;quot;quebre&amp;quot; já com erros de compilação.&lt;br /&gt;
&lt;br /&gt;
= Funcionamento =&lt;br /&gt;
&lt;br /&gt;
O MetaObject por padrão &amp;#039;&amp;#039;&amp;#039;tem o mesmo nome que o VO a qual ele descreve e é salvo no mesmo package, com a única diferença que leva um sufixo &amp;#039;_&amp;#039;&amp;#039;&amp;#039;&amp;#039;. Ou seja, caso tenhamos um &amp;#039;&amp;#039;&amp;#039;PersonVO&amp;#039;&amp;#039;&amp;#039; no sistema, o seu MetaObject será o &amp;#039;&amp;#039;&amp;#039;PersonVO_&amp;#039;&amp;#039;&amp;#039;, salvos &amp;quot;um do lado do outro&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Este objeto tem métodos com o exato nome do atributo do VO que ele representa. Por exemplo, se o PersonVO tem um atributo &amp;#039;fullName&amp;#039;, o PersonVO_ terá um método &amp;#039;fullName()&amp;#039;, que retornará a String &amp;#039;fullName&amp;#039; como desejado para passar para o Framework.&lt;br /&gt;
&lt;br /&gt;
Nos casos em que o atributo retorne outro VO, como no nosso exemplo do PersonVO com o atributo &amp;#039;parent&amp;#039; que retorna outro PersonVO, o PersonVO_ terá um método chamado &amp;#039;parent()&amp;#039;, que dessa vez não retorna uma String, mas sim o MetaObject do objeto retornado no VO. No nosso caso o próprio PersonVO_. E então conseguiríamos obter o caminho para o atributo &amp;#039;fullname&amp;#039; do objeto retornado a partir do retorno de &amp;#039;dad&amp;#039;. O código ficaria assim:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;parent().fullName()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O que retornaria a String &amp;quot;parent.fullName&amp;quot;, como esperado pelo Framework. E com a vantagem que esse código &amp;quot;quebra&amp;quot; se parent ou fullname deixarem de existir em PersonVO.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Imagine agora que você queira o caminho de &amp;#039;parent&amp;#039; e não de um atributo dentro de parent. E parent não retorna a String, retorna outro MetaObject de PersonVO. Nestes casos, pode-se chamar o método path(). Que força o retorno do caminho até aquele ponto, sem obter um atributo dentro do MetaObject retornado. Por exemplo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;parent().path()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa código retornará a String &amp;quot;parent&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir deste funcionamento podemos obter e descrever o caminho para qualquer propriedade de um VO independente de quantas referências ou &amp;quot;níveis de cadeia&amp;quot; um VO tenha dentro do outro.&lt;br /&gt;
&lt;br /&gt;
= Constantes Vs. Métodos =&lt;br /&gt;
&lt;br /&gt;
Para evitar que o MetaObject seja instanciado o tempo todo, cada Meta Object tem uma constante chamada &amp;quot;VO&amp;quot; que carrega uma instância estática do objeto. A maneira correta de utilizar o MetaObject seria a seguinte (de acordo com o exemplo de PersonVO citado acima):&lt;br /&gt;
&lt;br /&gt;
{{java|Utilização do MetaObject por Métodos|&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
PersonVO_.VO.fullName() //Retorna a String &amp;quot;fullName&amp;quot;&lt;br /&gt;
PersonVO_.VO.parent().path() //Retorna a String &amp;quot;parent&amp;quot;&lt;br /&gt;
PersonVO_.VO.parent().fullName() //Retorna a String &amp;quot;parent.fullName&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
A sintaxe citada acima é que é definida por métodos. É a melhor e mais simples maneira de se referenciar os atributos ou suas cadeiras de atributos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Porém, há ainda as constantes de atributos. As constantes sequem a seguinte sintaxe:&lt;br /&gt;
&lt;br /&gt;
{{java|Utilização do MetaObject por Constantes|&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
PersonVO_._fullName //Constante com a String &amp;quot;fullName&amp;quot;&lt;br /&gt;
PersonVO_._dad //Retorna a String &amp;quot;dad&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
Para um atributo direto do VO (que não retorne outro VO), não há diferença entre um método e outro. Isto é &amp;quot;PersonVO_.VO.fullName()&amp;quot; ou &amp;quot;PersonVO_._fullName&amp;quot; tem exatamente o mesmo resultado. Mas note que nessa sintaxe a constante &amp;#039;_parent&amp;#039; retorna diretamente a String &amp;quot;parent&amp;quot; ao invés do MetaObject do objeto retornado pelo atributo &amp;#039;parent&amp;#039; original do VO. &amp;#039;&amp;#039;&amp;#039;Isso impossibilita que seja montada uma cadeia completa com atributos aninhados!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Se o acesso por constantes tem menos funcionalidades, para que existem ambos? Em alguns casos a referência ao atributo precisa ser uma constante final. Como por exemplo a referência de atributos dentro de Annotations. Nestes casos a utilização do método não pode ser utilizado, pois o java entende que o retorno de um método não será constante.&lt;br /&gt;
&lt;br /&gt;
Mas e se na annotation eu precisar referenciar um atributo aninhado? Como obter o caminho completo? A resposta é que não tem como obter diretamente. Mas mesmo assim recomendamos a utilização dos MetaObjects. Por exemplo para obter o mesmo resultado de &amp;quot;PersonVO_.VO.parent().fullName()&amp;quot; (que seria &amp;quot;parent.fullName&amp;quot;) teríamos de utilizar o seguinte código:&lt;br /&gt;
&lt;br /&gt;
{{java|Utilização do MetaObject por Constantes|&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
PersonVO_._parent + &amp;quot;.&amp;quot; + PersonVO_._fullName&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Desta forma temos o mesmo resultado utilizando apenas os acessos de constantes. Embora mais trabalhoso, e ainda passível de se montar um caminho de atributos inválidos, o código continuará &amp;quot;quebrando&amp;quot; caso alguma das propriedades mude ou deixe de existir. Melhorando a qualidade do código evitando BUGs e erros.&lt;br /&gt;
&lt;br /&gt;
= Escrevendo o MetaObject =&lt;br /&gt;
&lt;br /&gt;
Bom, tudo isso é legal, mas é muito trabalhoso ter que ficar escrevendo e editando o MetaObject a cada vez que faço uma alteração no VO.&lt;br /&gt;
&lt;br /&gt;
FATO! Por isso o RFW conta com um Plugin para Eclipse que sempre que se você &amp;#039;&amp;#039;&amp;#039;escrever uma clase cujo nome termine com VO e que estenda RFWVO&amp;#039;&amp;#039;&amp;#039;, ele gera automaticamente a classe do lado do VO.&lt;br /&gt;
&lt;br /&gt;
Para instalar e fazer o &amp;#039;&amp;#039;&amp;#039;[[RFWMetaObjectGenerator]]&amp;#039;&amp;#039;&amp;#039; verifique a página do projeto do PlugIn.&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
</feed>