Protheus News TL++ Reflection & Annotation

protheusnews_4

Voltamos com mais um post da série Protheus News, dessa vez trazendo mais uma novidade do TL++ para quem gosta de trabalhar com orientação a objetos.

Você pode com o TL++ trabalhar com Reflection e Annotation, veja abaixo um exemplo:

fonte EveryPessoa.tlpp

#include ‘totvs.ch’

@annotation parametros

    nome as char

    tipoParametro as char

    tamanho as numeric

    decimal as numeric

    descricao as char

@end

@annotation classe

    nome as char

    descricao as char

@end

namespace EverySystem

@classe (nome= “Pessoa”, descricao= “Classe de pessoa”)

@parametros(nome = “cNome”      , tipoParametro=”character” , tamanho=50, decimal=0, descricao=”Nome da pessoa”)

@parametros(nome = “cSobrenome” , tipoParametro=”character” , tamanho=50, decimal=0, descricao=”Sobrenome da pessoa”)

@parametros(nome = “cCpf”       , tipoParametro=”character” , tamanho=11, decimal=0, descricao=”CPF da pessoa”)

class Pessoa

    public method  new() constructor

    public method  getNome()

    public method  getSobrenome()

    public method  getCpf()

    private data cNome as string

    private data cSobrenome as string

    private data cCpf as string

endClass

/*/{Protheus.doc} Pessoa::new

Método construtor

@type method

@version  1.0

@author every system

@since 20/05/2021

@param cNome, character, nome da pessoa

@param cSobrenome, character, sobrenome da pessoa

@param cCpf, character, cpf da pessoa

/*/

method new(cNome, cSobrenome, cCpf) class Pessoa

    self:cNome := cNome

    self:cSobrenome := cSobrenome

    self:cCpf := cCpf

return

method getNome() class Pessoa

return self:cNome

method getSobrenome() class Pessoa

return self:cSobrenome

method getCpf() class Pessoa

return self:cCpf


fonte everyReflectionTeste.tlpp

#include ‘totvs.ch’

using namespace EverySystem

user function testeReflection()

    local aClasse as array

    local aParams as array

    //————————————————————————————————————————-

    //Verificando todas as classes do namespace “EverySystem” com a annotation “classe”

    //———————————————————————————————————————–

    aClasse := Reflection.getClassesByAnnotation(“classe”, “EverySystem”)

    //—————————————————-

    //Verificando os parâmetros da classe

    //—————————————————-

    aParams := Reflection.getClassAnnotationList(aClasse[1]:cClassName)

    //———————————————–

    //Atribuindo valores aos parâmetros

    //———————————————–

    &(aParams[2][“nome”]) := “João”

    &(aParams[3][“nome”]) := “Amaro”

    &(aParams[4][“nome”]) := “12345678911”

    //—————————————–

    //Instanciando a classe Pessoa

    //—————————————–

    oPessoa := aClasse[1]:CreateInstance(&(aParams[2][“nome”]), &(aParams[3][“nome”]), &(aParams[4][“nome”]))

    //——————————————————

    //Testando os métodos da classe Pessoa

    //——————————————————-

    conout(oPessoa:getNome())

    conout(oPessoa:getSobrenome())

    conout(oPessoa:getCpf())

return

Veja que você pode criar annotations personalizadas e também instanciar objetos através da classe Reflection facilmente.

Para quem se interessou veja mais no site da TOTVS:

https://tdn.totvs.com/display/tec/Reflection+e+Annotation

Espero que tenham gostado!

Até a próxima edição do Protheus News!

Compartilhe esse conteúdo

LinkedIn
Twitter
Facebook

Conheça os serviços da EverySystem

Conteúdos relacionados

Utilizamos cookies para qualificar sua experiência nesta página e aperfeiçoar nosso site. Ao clicar em “ok, entendi”, você concorda com esta utilização. Mais informações podem ser obtidas em nossa Política de privacidade.