Ir para conteúdo

Pesquisar na Comunidade

Mostrando resultados para as tags ''reflection''.

  • Pesquisar por Tags

    Digite tags separadas por vírgulas
  • Pesquisar por Autor

Tipo de Conteúdo


Fóruns

  • Comunidade
    • Informações Importantes
    • Anúncios
    • Membros
    • Lista negra
    • Eventos
  • Minecraft
    • Seu servidor hospedado no lugar certo!
    • Servidores
    • Construções
    • Plugins
    • Skripts
    • Serviços
    • Geral
  • FiveM
    • Servidores
    • Desenvolvimento
    • Serviços
    • Outros
  • Programação
    • Geral
    • Java
    • Web & Desktop
    • Discord
    • Servidores dedicados para grandes projetos.
  • Sistemas operacionais
    • Windows
    • Linux
    • Celular
  • Fóruns
    • Invision Power Services (IPS)
    • XenForo
    • Legacy IPB
    • Outros
  • Design
    • Pedidos
    • Dúvidas
    • Exposição
    • Tutoriais
    • Recursos
  • Jornalismo
    • Notícias
    • Entrevistas
    • Eventos
    • Outros
  • Jogos
    • Geral
    • Novidades
    • Tutoriais
    • Gêneros
    • Outros Jogos
  • Outros
    • Tutoriais Gerais
    • Mercado
    • Assuntos diversos
    • Barzinho
    • Arquivos

Encontrar resultados em...

Encontrar resultados que...


Data de Criação

  • Início

    FIM


Data de Atualização

  • Início

    FIM


Filtrar pelo número de...

Data de Registro

  • Início

    FIM


Grupo


Discord


Instagram


X (Ex-Twitter)


WhatsApp


GitHub


Localização


Nick do Minecraft

Encontrado 1 registro

  1. O que é reflection? Reflection é um recurso do java que permite manipular e editar classes, métodos, atributos, etc em tempo de execução. Com isso, por exemplo, é possível instanciar uma classe sem que a mesma seja adicionada ao projeto. Além disso, dá até para modificar e acessar construtores, atributos e métodos privados. Sabe aquela string privada que você ficava doido querendo mudar? Com reflection isso é possível. Mas como manipular as classes? Primeiro é preciso adquirir uma referência à classe, mas como fazer isso? Existem três maneiras de fazer isso: // Através de uma instância da classe String string = "Reflection é legal"; Class<?> clazz = string.getClass(); // Através da própria classe Class<String> clazz = String.class; // Através do método Class#forName(String className); try { Class<?> clazz = Class.forName("java.lang.String"); } catch (ClassNotFoundException e) { e.printStackTrace(); } Como foi possível observar, nos dois primeiros métodos é necessário que as classes em questão façam parte do projeto. Já no último método, basta que você tenha o nome da classe. Mas é só isso? Não, isso é só a ponta do iceberg, a partir daqui infinitas possibilidades são abertas para a manipulação da classe. Constructor (docs) O que é um Constructor? É uma classe que permite instanciar as classes. Como conseguir os construtores de uma classe? // Através do método Class#getConstructors(); Constructor[] constructors = clazz.getConstructors(); /* Através do método Class#getConstructor(Class<?>... parameterTypes); * Note que com esse método é necessário especificar os parâmetros do construtor */ try { Constructor<?> constructor = clazz.getConstructor(String.class); } catch (NoSuchMethodException e1) { e1.printStackTrace(); } catch (SecurityException e2) { e2.printStackTrace(); } Construtor em mãos, mas como conseguir uma instância da classe? É agora que utilizaremos o método Constructor#newInstance(Object... initargs); /* Note que os parâmetros que você utilizar no newInstance(); * Devem ser idênticos ao do construtor que você está utilizando */ try { Constructor<?> constructor = clazz.getConstructor(String.class); Object string = constructor.newInstance("Criei uma string com Reflection =D"); } catch (Exception e) { e.printStackTrace(); } Mas se o método newInstance() retorna um Object, como que eu irei utilizar os métodos e atributos da instância? Eu tive todo esse trabalho para instância uma classe atoa? Não. Veremos a seguir como manipular os métodos e atributos da nossa instância. Field (docs) Esta é a classe que permite acessar e modificar os atributos de uma instância. Para acessar os atributos da classe vamos utilizar o método Class#getDeclaredFields(); Field[] field = clazz.getDeclaredFields(); Mas e se eu precisar de buscar por um atributo específico? Tal como a array de carácteres de uma String? // Para isso utilizaremos o método Class#getDeclaredField(String name); try { Field field = clazz.getDeclaredField("value"); } catch (Exception e) { e.printStackTrace(); } Talvez você tenha percebido que para conseguir aquele atributo, utilizamos o método da Classe, e não da instância que criamos agora a pouco. Se não percebeu, tudo bem, mas agora deve estar se perguntando, onde entra o objeto que fizemos? Nós iremos utilizar o método Field#get(Object object); onde object é a instância de onde vamos buscar o atributo especificado. Mas e se for um atributo estático, que não pertence ao escopo da instância mas sim ao da classe? Basta colocar null. Mas antes de acessarmos o atributo, você talvez tenha pensado: "Mas eu não sabia da existência desse atributo". Pois é, eu também não sabia, tive que olhar na source da classe String. Isso é porque o atributo é privado, então para acessarmos ele é necessário um método bem especial, o AccessibleObject#setAccessible(boolean flag); field.setAccessible(true); Agora sim podemos pegar o atributo. try { Object value = field.get(string); } catch (Exception e) { e.printStackTrace(); } Mas o atributo value é uma array, o que fazer? try { Object[] value = (Object[]) field.get(string); } catch (Exception e) { e.printStackTrace(); } Basta fazer um cast. Method (docs) Agora chega a parte mais interessante, os métodos. Assim como o Field, para conseguir os métodos de uma classe utilizaremos Class#getDeclaredMethods(); Method[] methods = clazz.getDeclaredMethods(); Apesar da semelhança para conseguir os métodos declarados, existe uma pequena diferença na hora de buscar por um método específico, pois além do nome, é necessário apresentar os parâmetros do método em questão. Como exemplo pegaremos o método String#length(); /* Note que caso o método em questão não precise de argumentos * Só é necessário o nome do mesmo: clazz.getDeclaredMethod("length"); /* try { Method method = clazz.getDeclaredMethod("indexOf", String.class); } catch (Exception e) { e.printStackTrace(); } Agora você deve ter notado que a nossa instância não fui utilizada né? Para chamar o método nós precisamos do método Method#invoke(Object obj, Object... args); try { method.invoke(string, "Criei"); } catch (Exception e) { e.printStackTrace(); } Observação: Assim como no Field, se o método for estático basta colocar o primeiro parâmetro como null. Considerações finais Este tutorial foi bem simples pois ele foca nas classes mais usadas do pacote java.lang.reflect Você pode ter mais informações sobre reflection acessando esses links: https://docs.oracle.com/javase/tutorial/reflect/ http://www.oracle.com/technetwork/articles/java/javareflection-1536171.html
×
×
  • Criar Novo...