SlideShare uma empresa Scribd logo
Código “invocado” com
   java.lang.invoke
      JustJava 2012
Marcelo de Castro          Alexandre Castro
marcelo@castro.eti.br   alexandre@castro.eti.br
   @mcastroinfo            @CastroAlexandre
Código “invocado com
      java.lang.invoke
• Pacote java.lang.invoke
 – JSR 292
• Show me the code!
 – Exemplos de uso da API
 – Comparativo do desempenho entre
   Chamadas
   •   Diretas
   •   Reflection (java.lang.Method)
   •   MethodHandle (java.lang.invoke)
   •   CallSite (java.lang.invoke)
0101010101011111000000000101001110001
1100011100000001111010101010110001110
1001001010000101001010101011010110111
java.lang.invoke
java.lang.invoke
• CallSite
    – ConstantCallSite
    – MutableCallSite
    – VolatileCallSite
•   MethodHandle
•   MethodHandleProxies
•   MethodHandles
•   MethodHandles.Lookup
•   MethodType
•   SwitchPoint
•   WrongMethodTypeException
java.lang.invoke
• CallSite
    – ConstantCallSite
    – MutableCallSite
    – VolatileCallSite
•   MethodHandle
•   MethodHandleProxies
•   MethodHandles
•   MethodHandles.Lookup
•   MethodType
•   SwitchPoint
•   WrongMethodTypeException
<abstract> CallSite
• Um CallSite detém um MethodHandle, que
  é chamado de alvo (target)
• Uma instrução invokedynamic vinculada a
  um CallSite delega todas as chamadas ao
  alvo atual.
• Implementações
  – ConstantCallSite
  – MutableCallSite
  – VolatileCallSite
Implementações de CallSite
• ConstantCallSite
  – Não permite a alteração do MethodHandle alvo
    (target)
  – Toda chamada ao método setTarget lança uma
    UnsupportedOperationException
• MutableCallSite
  – Permite a alteração do MethodHandle alvo
    ("target“)
• VolatileCallSite
   – O MethodHandle alvo ("target") funciona
    como uma variável volátil (volatile*)
MethodHandle
• Pode referenciar
  – um método (de classe ou instância)
  – um campo (de classe ou instância)
  – um construtor
  – outro MethodHandle
• Pode opcionalmente sofrer alterações dos
  argumentos e valores de retorno (ver
  MethodHandles)
MethodHandleProxies
• Classe que contém métodos estáticos que criam
  instâncias de MethodHandle capazes de
  trabalhar com outros tipos de elementos, como
  interfaces por exemplo
MethodHandles
• Provê apenas métodos estáticos que
  possibilitam manipular uma referência de
  MethodHandle
   – Criando
   – Combinando
   – Transformando
   – Convertendo
MethodHandle.Lookup
• fábrica para criação de MethodHandle quando
  a criação requer verificação da restrição de
  acesso.
• A restrição de acesso (visibilidade) do
  MethodHandle é realizada neste momento e
  não quando o MethodHandle é chamado.
MethodType
• Classe final que representa o tipo de retorno e
  os argumentos (se houver) do métodos (colocar
  campos etc) que será manipulado por um
  MethodHandle
• Todas instâncias de MethodType são imutáveis
• Possui construtor privado, objetos são obtidos
  por métodos
SwitchPoint
• Um SwitchPoint é um objeto que pode publicar
  transições de estado para outras threads
• Transições de estado: válido → inválido
• Pode combinar um par de MethodHandle
  (target, fallback com o mesmo MethodType)
  em um novo MethodHandle “delegador”
• O estado do SwitchPoint determina qual vai
  receber a delegação
  – Válido => target
  – Inválido => fallback
WrongMethodTypeException
• RuntimeException
• Indica que o ocorreu a tentativa de construção,
  combinação, ou chamada de um MethodHandle
  por meio de tipo errados (MethodType), o que
  ocorrer primeiro
0101010101011111000000000101001110001
1100011100000001111010101010110001110
1001001010000101001010101011010110111
SHOW ME THE CODE!
MethodTypeExample.java
MethodType mtStrRetStrArg =
  MethodType.methodType(String.class, String.class);

MethodType mtIntRet =
  MethodType.methodType(int.class);

MethodType mtStrRetIntArg =
  MethodType.methodType(String.class, int.class);
MethodHandlerExample.java
MethodHandle mhConcat =
   MethodHandles.lookup().findVirtual
        (String.class,"concat", mtStrReturnStrArg);
String retConcat = (String) mhConcat.invokeExact("Ja", "va“);
System.out.println(retConcat);// Java

MethodHandle mhLength =
   MethodHandles.lookup().findVirtual
   (String.class, "length", mtIntReturn);
int retLength = (int) mhLength.invokeExact("Java“);
System.out.println(retLength);// 4

MethodHandle mhToBinaryString =
   MethodHandles.lookup().findStatic
        (Integer.class, "toBinaryString", stStrRetIntArg);
String bStr = (String) mhToBinaryString.invokeExact(10);
System.out.println(bStr);// 1010
DropArgumentsExample.java
MethodHandle mhConcat = getConcatMethodHandle();
String str0 =(String)mhConcat.invokeExact("x", "y");
//xy
MethodHandle mhIgnoreArg0 = MethodHandles.
   dropArguments (mhConcat, 0, String.class);
String str1 =
   (String)mhIgnoreArg0.invokeExact("x", "y", "z");
//yz
MethodHandle mhIgnoreArg1And2 MethodHandles.
   dropArguments(mhConcat, 1, int.class, String.class);
String str2 =
   (String) mhIgnoreArg1And2.invokeExact("x", 1, "y", "z");
//xz
InsertArgumentsExample.java
MethodHandle mhReplace = getReplaceMethodHandle();
String str0 = (String)
   mhReplace.invokeExact("JustJava", 'a','4'));
// JustJ4v4

MethodHandle mhInsertArg1 = MethodHandles.
       insertArguments(mhReplace, 1,'J');
String str1 = (String)
   mhInsertArg1.invokeExact("JustJava",    'X'));
//XustXava

 MethodHandle mhInserArg2 = MethodHandles.
       insertArguments(mhInsertArg1, 0, "JustJava");
String str1 = (String)
       mhInserArg2.invokeExact(                 'T'));
//TustTava
InsertArgumentsExample.java
MethodHandle mhReplace = getReplaceMethodHandle();
String str0 = (String)
   mhReplace.invokeExact("JustJava", 'a','4'));
// JustJ4v4

MethodHandle mhInsertArg1 = MethodHandles.
       insertArguments(mhReplace, 1,'J');
String str1 = (String)
   mhInsertArg1.invokeExact("JustJava",‘J’, 'X'));
//XustXava

 MethodHandle mhInserArg2 = MethodHandles.
       insertArguments(mhInsertArg1, 0, "JustJava");
String str1 = (String)
       mhInserArg2.invokeExact(                 'T'));
//TustTava
InsertArgumentsExample.java
MethodHandle mhReplace = getReplaceMethodHandle();
String str0 = (String)
   mhReplace.invokeExact("JustJava", 'a','4'));
// JustJ4v4

MethodHandle mhInsertArg1 = MethodHandles.
       insertArguments(mhReplace, 1,'J');
String str1 = (String)
   mhInsertArg1.invokeExact("JustJava",    'X'));
//XustXava

 MethodHandle mhInserArg2 = MethodHandles.
       insertArguments(mhInsertArg1, 0, "JustJava");
String str1 = (String)
       mhInserArg2.invokeExact(‘JustJava’, ‘J’, 'T'));
//TustTava
PermuteArgumentsExample.java
MethodHandle mhRePlace = getReplaceMethodHandle();
String str0 =
   (String) mhRePlace.invokeExact("JustJava", 'a', 'u‘);
//JustJuvu

MethodHandle mhPlaceRe = MethodHandles.
   permuteArguments(mhRePlace, mtNovo, 0, 2, 1);

String str0 = (String)
       mhPlaceRe.invokeExact("JustJava", 'a', 'u'));
//JastJava
FilterReturnValueExample.java
/*O argumento do filtro (se houver)
  deve ser o mesmo do tipo de retorno do alvo */
MethodHandle mhAdapter =
  MethodHandles.
  filterReturnValue(mhConcatTarget, mhLengthFilter);

mhAdapter.invoke(“Just", “Java")//8

/* mhConcatTarget.type()=> (String, String)String
 * mhLengthFilter.type()=> (String)int
 * mhAdapter.type();    => (String, String)int
 */
CallSiteExample.java
CallSite callSite = new MutableCallSite(mtStrReturn);

MethodHandle mhDynamic = callSite.dynamicInvoker();

callSite.setTarget(
      MethodHandles.constant(String.class, “Just"));
String ret1 = (String) mhDynamic.invokeExact();//Just

MethodHandle worker =
  MethodHandles.filterReturnValue(mhDynamic, mhUpper);

callSite.setTarget(
      MethodHandles.constant(String.class, “Java"));
String ret2 = (String) worker.invokeExact();//JAVA
SwitchPointExample.java
SwitchPoint switchPoint = new SwitchPoint();
MethodHandle mhTarget = getConcatMethodHandle();
MethodHandle mhFallback = MethodHandles.
  permuteArguments(mhTarget, mhTarget.type(), 1, 0);

MethodHandle mhDelegator =
  switchPoint.guardWithTest(mhTarget, mhFallback);
                válido        inválido
String str=(String)mhDelegator.invoke("Just", "Java"));
//JustJava
SwitchPoint.
  invalidateAll(new SwitchPoint[]{switchPoint});

String str=(String)mhDelegator.invoke("Just", "Java"));
//JavaJust
ReflectionToInvokeExample
Method methodConcat =
  String.class.
  getDeclaredMethod("concat", String.class);

MethodHandle mhConcat =
  MethodHandles.lookup().unreflect(methodConcat);

System.out.println(mhConcat.invoke("Just", "Java"));
//JustJava
br.eti.castro.example.
       invoke.accesscontrol
• ClassToAcess
  –   publicField, protectedField, packegeField, privateField
  –   public void publicMethod(){}
  –   protected void protectedMethod(){}
  –   void packageMethod(){}
  –   private void privateMethod(){}
• FieldAcessTest
  – Acessando e atribuindo valores
• MethodAcessTest
  – Invocando os métodos
br.eti.castro.example.
      invoke.performance
• Increaser
  – public int increase(int i){return i++;}
• ExampleDirectlyInvoke
  – int r = inc.increase(i);
• ExampleReflect
  – int r = (int) method.invoke(object, param);
• ExampleInvoke
  – int r = (int) methodHandle.invokeExact(param);
• ExampleInvokeCallSite
  – int r = (int) mhBinded.invokeExact(param);
Referências
• JSR 292: Supporting Dynamically Typed Languages on the JavaTM Platform
  http://jcp.org/en/jsr/detail?id=292

• Javadoc SE 7 http://docs.oracle.com/javase/7/docs/api/

• Method Handles and Beyond… John R. Rose, Da Vinci Machine Project,
  JSR 292 Lead http://www.parleys.com/#id=2631&st=5
  @JVMLanguageSummit2011

• MethodHandle implemention tips and tricks Dan Heidinga
  http://bit.ly/KtZYqb @JVMLanguageSummit2011

• Java 7: Soporte a lenguajes dinámicos Roberto Montero Miguel
OBRIGADO!
 Marcelo de Castro          Alexandre Castro
marcelo@castro.eti.br   alexandre@castro.eti.br
   @mcastroinfo            @CastroAlexandre

Mais conteúdo relacionado

PDF
Aula actionscript basico
PDF
Python: a primeira mordida
PDF
Objetos Pythonicos - compacto
PPTX
Javascript
PDF
Apostila de ext js com php e postgresql v1.2
PDF
Apostila de ext js com php e postgresql v1.1
PDF
Apostila de ext js com php e postgresql v1.3
PDF
POO - 14 - Vetores
Aula actionscript basico
Python: a primeira mordida
Objetos Pythonicos - compacto
Javascript
Apostila de ext js com php e postgresql v1.2
Apostila de ext js com php e postgresql v1.1
Apostila de ext js com php e postgresql v1.3
POO - 14 - Vetores

Mais procurados (20)

PDF
Orientação a objetos em Python (compacto)
PDF
Iteráveis e geradores (versão RuPy)
PDF
POO - 13 - Arrays em Java
PDF
A Classe StringBuilder em Java
PDF
Introdução à Linguagem Ruby
DOC
Repetições e vetores
PPTX
Javascript avançado
PPTX
Estrutura de Dados em Java (Funções e Procedimentos)
PDF
Curso java 04 - ap is e bibliotecas
PDF
Estrutura de Dados - Procedimentos e Funções
PDF
Jython no JavaOne Latin America 2011
PDF
Java 06
PDF
POO - 12 - A Classe Object
PDF
Ajax O Objeto Xml Http Request Parte 3
PDF
POO - 04 - Variávies em Java
ODP
App scala
PPT
introdução a linguagem java-2003
PDF
Curso java 03 - métodos e parâmetros
PPTX
Threads e Estruturas de dados
ODP
Palestra2009
Orientação a objetos em Python (compacto)
Iteráveis e geradores (versão RuPy)
POO - 13 - Arrays em Java
A Classe StringBuilder em Java
Introdução à Linguagem Ruby
Repetições e vetores
Javascript avançado
Estrutura de Dados em Java (Funções e Procedimentos)
Curso java 04 - ap is e bibliotecas
Estrutura de Dados - Procedimentos e Funções
Jython no JavaOne Latin America 2011
Java 06
POO - 12 - A Classe Object
Ajax O Objeto Xml Http Request Parte 3
POO - 04 - Variávies em Java
App scala
introdução a linguagem java-2003
Curso java 03 - métodos e parâmetros
Threads e Estruturas de dados
Palestra2009
Anúncio

Destaque (20)

PPT
Invoke dynamics
PPTX
6. enfoque sociocultural
PDF
3721shopping.net
PDF
8 informe general
PPTX
Las dos nubes amigas
PPTX
Virgilinz 2012
PDF
5 formulario numero telefonico
PDF
Menerapkan hosting Gratisan
PPSX
Las claves de un best-seller
PDF
Denuncia dabeiba 21 abril
PDF
Dive into .git 日本語版
PPT
Hipervínculos
PPTX
Freshcotton
PDF
Ley de Movilidad ALDF
PDF
Informe empresa
PDF
Formulario teléfonico
PDF
Informe consulta general criterio
PDF
Iniciativa Cannabis ante Congreso de la Unión
PPT
Ying Ying Huang i Bruna Vidiella
ODP
Slideshare
Invoke dynamics
6. enfoque sociocultural
3721shopping.net
8 informe general
Las dos nubes amigas
Virgilinz 2012
5 formulario numero telefonico
Menerapkan hosting Gratisan
Las claves de un best-seller
Denuncia dabeiba 21 abril
Dive into .git 日本語版
Hipervínculos
Freshcotton
Ley de Movilidad ALDF
Informe empresa
Formulario teléfonico
Informe consulta general criterio
Iniciativa Cannabis ante Congreso de la Unión
Ying Ying Huang i Bruna Vidiella
Slideshare
Anúncio

Semelhante a Codigo invocado com java.lang.invoke (20)

PDF
Jsummit 2014
PDF
Novidades do Java 8
PPTX
Introdução à Metaprogramação com Java Reflection API
PPT
Encapsulamento em oo
PDF
Atribuições
PPT
Desenvolvimento de Software
PPTX
Curso java 01 - molhando os pés com java
PPTX
Java - Visão geral e Exercícios
PDF
A linguagem java
PPTX
Java hidden features
PDF
Introdução a programação I
PDF
Declarações e Controle de Acesso
PDF
Atualização Java 8 (2014)
PPT
Java Básico
ODP
Unidade iii aula 02 - introdução ao java
PDF
UFCG.JCert Reunião 1 - Declarações e Controle de Acesso
PPTX
Programação Orientado a Objetos - Sessao 4.pptx
ODP
Programação Defensiva
PPT
55 New Things in Java 7 - Brazil
PDF
1 exercicio funcoes com string e manipulacao com arquivo
Jsummit 2014
Novidades do Java 8
Introdução à Metaprogramação com Java Reflection API
Encapsulamento em oo
Atribuições
Desenvolvimento de Software
Curso java 01 - molhando os pés com java
Java - Visão geral e Exercícios
A linguagem java
Java hidden features
Introdução a programação I
Declarações e Controle de Acesso
Atualização Java 8 (2014)
Java Básico
Unidade iii aula 02 - introdução ao java
UFCG.JCert Reunião 1 - Declarações e Controle de Acesso
Programação Orientado a Objetos - Sessao 4.pptx
Programação Defensiva
55 New Things in Java 7 - Brazil
1 exercicio funcoes com string e manipulacao com arquivo

Último (16)

PDF
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
PDF
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
PDF
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
PPTX
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
PDF
Processos na gestão de transportes, TM100 Col18
PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
PDF
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
PDF
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PDF
COBITxITIL-Entenda as diferença em uso governança TI
PPTX
Arquitetura de computadores - Memórias Secundárias
PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PPTX
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
PDF
Custos e liquidação no SAP Transportation Management, TM130 Col18
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
Processos na gestão de transportes, TM100 Col18
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
COBITxITIL-Entenda as diferença em uso governança TI
Arquitetura de computadores - Memórias Secundárias
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
Custos e liquidação no SAP Transportation Management, TM130 Col18

Codigo invocado com java.lang.invoke

  • 1. Código “invocado” com java.lang.invoke JustJava 2012
  • 2. Marcelo de Castro Alexandre Castro marcelo@castro.eti.br alexandre@castro.eti.br @mcastroinfo @CastroAlexandre
  • 3. Código “invocado com java.lang.invoke • Pacote java.lang.invoke – JSR 292 • Show me the code! – Exemplos de uso da API – Comparativo do desempenho entre Chamadas • Diretas • Reflection (java.lang.Method) • MethodHandle (java.lang.invoke) • CallSite (java.lang.invoke)
  • 5. java.lang.invoke • CallSite – ConstantCallSite – MutableCallSite – VolatileCallSite • MethodHandle • MethodHandleProxies • MethodHandles • MethodHandles.Lookup • MethodType • SwitchPoint • WrongMethodTypeException
  • 6. java.lang.invoke • CallSite – ConstantCallSite – MutableCallSite – VolatileCallSite • MethodHandle • MethodHandleProxies • MethodHandles • MethodHandles.Lookup • MethodType • SwitchPoint • WrongMethodTypeException
  • 7. <abstract> CallSite • Um CallSite detém um MethodHandle, que é chamado de alvo (target) • Uma instrução invokedynamic vinculada a um CallSite delega todas as chamadas ao alvo atual. • Implementações – ConstantCallSite – MutableCallSite – VolatileCallSite
  • 8. Implementações de CallSite • ConstantCallSite – Não permite a alteração do MethodHandle alvo (target) – Toda chamada ao método setTarget lança uma UnsupportedOperationException • MutableCallSite – Permite a alteração do MethodHandle alvo ("target“) • VolatileCallSite – O MethodHandle alvo ("target") funciona como uma variável volátil (volatile*)
  • 9. MethodHandle • Pode referenciar – um método (de classe ou instância) – um campo (de classe ou instância) – um construtor – outro MethodHandle • Pode opcionalmente sofrer alterações dos argumentos e valores de retorno (ver MethodHandles)
  • 10. MethodHandleProxies • Classe que contém métodos estáticos que criam instâncias de MethodHandle capazes de trabalhar com outros tipos de elementos, como interfaces por exemplo
  • 11. MethodHandles • Provê apenas métodos estáticos que possibilitam manipular uma referência de MethodHandle – Criando – Combinando – Transformando – Convertendo
  • 12. MethodHandle.Lookup • fábrica para criação de MethodHandle quando a criação requer verificação da restrição de acesso. • A restrição de acesso (visibilidade) do MethodHandle é realizada neste momento e não quando o MethodHandle é chamado.
  • 13. MethodType • Classe final que representa o tipo de retorno e os argumentos (se houver) do métodos (colocar campos etc) que será manipulado por um MethodHandle • Todas instâncias de MethodType são imutáveis • Possui construtor privado, objetos são obtidos por métodos
  • 14. SwitchPoint • Um SwitchPoint é um objeto que pode publicar transições de estado para outras threads • Transições de estado: válido → inválido • Pode combinar um par de MethodHandle (target, fallback com o mesmo MethodType) em um novo MethodHandle “delegador” • O estado do SwitchPoint determina qual vai receber a delegação – Válido => target – Inválido => fallback
  • 15. WrongMethodTypeException • RuntimeException • Indica que o ocorreu a tentativa de construção, combinação, ou chamada de um MethodHandle por meio de tipo errados (MethodType), o que ocorrer primeiro
  • 17. MethodTypeExample.java MethodType mtStrRetStrArg = MethodType.methodType(String.class, String.class); MethodType mtIntRet = MethodType.methodType(int.class); MethodType mtStrRetIntArg = MethodType.methodType(String.class, int.class);
  • 18. MethodHandlerExample.java MethodHandle mhConcat = MethodHandles.lookup().findVirtual (String.class,"concat", mtStrReturnStrArg); String retConcat = (String) mhConcat.invokeExact("Ja", "va“); System.out.println(retConcat);// Java MethodHandle mhLength = MethodHandles.lookup().findVirtual (String.class, "length", mtIntReturn); int retLength = (int) mhLength.invokeExact("Java“); System.out.println(retLength);// 4 MethodHandle mhToBinaryString = MethodHandles.lookup().findStatic (Integer.class, "toBinaryString", stStrRetIntArg); String bStr = (String) mhToBinaryString.invokeExact(10); System.out.println(bStr);// 1010
  • 19. DropArgumentsExample.java MethodHandle mhConcat = getConcatMethodHandle(); String str0 =(String)mhConcat.invokeExact("x", "y"); //xy MethodHandle mhIgnoreArg0 = MethodHandles. dropArguments (mhConcat, 0, String.class); String str1 = (String)mhIgnoreArg0.invokeExact("x", "y", "z"); //yz MethodHandle mhIgnoreArg1And2 MethodHandles. dropArguments(mhConcat, 1, int.class, String.class); String str2 = (String) mhIgnoreArg1And2.invokeExact("x", 1, "y", "z"); //xz
  • 20. InsertArgumentsExample.java MethodHandle mhReplace = getReplaceMethodHandle(); String str0 = (String) mhReplace.invokeExact("JustJava", 'a','4')); // JustJ4v4 MethodHandle mhInsertArg1 = MethodHandles. insertArguments(mhReplace, 1,'J'); String str1 = (String) mhInsertArg1.invokeExact("JustJava", 'X')); //XustXava MethodHandle mhInserArg2 = MethodHandles. insertArguments(mhInsertArg1, 0, "JustJava"); String str1 = (String) mhInserArg2.invokeExact( 'T')); //TustTava
  • 21. InsertArgumentsExample.java MethodHandle mhReplace = getReplaceMethodHandle(); String str0 = (String) mhReplace.invokeExact("JustJava", 'a','4')); // JustJ4v4 MethodHandle mhInsertArg1 = MethodHandles. insertArguments(mhReplace, 1,'J'); String str1 = (String) mhInsertArg1.invokeExact("JustJava",‘J’, 'X')); //XustXava MethodHandle mhInserArg2 = MethodHandles. insertArguments(mhInsertArg1, 0, "JustJava"); String str1 = (String) mhInserArg2.invokeExact( 'T')); //TustTava
  • 22. InsertArgumentsExample.java MethodHandle mhReplace = getReplaceMethodHandle(); String str0 = (String) mhReplace.invokeExact("JustJava", 'a','4')); // JustJ4v4 MethodHandle mhInsertArg1 = MethodHandles. insertArguments(mhReplace, 1,'J'); String str1 = (String) mhInsertArg1.invokeExact("JustJava", 'X')); //XustXava MethodHandle mhInserArg2 = MethodHandles. insertArguments(mhInsertArg1, 0, "JustJava"); String str1 = (String) mhInserArg2.invokeExact(‘JustJava’, ‘J’, 'T')); //TustTava
  • 23. PermuteArgumentsExample.java MethodHandle mhRePlace = getReplaceMethodHandle(); String str0 = (String) mhRePlace.invokeExact("JustJava", 'a', 'u‘); //JustJuvu MethodHandle mhPlaceRe = MethodHandles. permuteArguments(mhRePlace, mtNovo, 0, 2, 1); String str0 = (String) mhPlaceRe.invokeExact("JustJava", 'a', 'u')); //JastJava
  • 24. FilterReturnValueExample.java /*O argumento do filtro (se houver) deve ser o mesmo do tipo de retorno do alvo */ MethodHandle mhAdapter = MethodHandles. filterReturnValue(mhConcatTarget, mhLengthFilter); mhAdapter.invoke(“Just", “Java")//8 /* mhConcatTarget.type()=> (String, String)String * mhLengthFilter.type()=> (String)int * mhAdapter.type(); => (String, String)int */
  • 25. CallSiteExample.java CallSite callSite = new MutableCallSite(mtStrReturn); MethodHandle mhDynamic = callSite.dynamicInvoker(); callSite.setTarget( MethodHandles.constant(String.class, “Just")); String ret1 = (String) mhDynamic.invokeExact();//Just MethodHandle worker = MethodHandles.filterReturnValue(mhDynamic, mhUpper); callSite.setTarget( MethodHandles.constant(String.class, “Java")); String ret2 = (String) worker.invokeExact();//JAVA
  • 26. SwitchPointExample.java SwitchPoint switchPoint = new SwitchPoint(); MethodHandle mhTarget = getConcatMethodHandle(); MethodHandle mhFallback = MethodHandles. permuteArguments(mhTarget, mhTarget.type(), 1, 0); MethodHandle mhDelegator = switchPoint.guardWithTest(mhTarget, mhFallback); válido inválido String str=(String)mhDelegator.invoke("Just", "Java")); //JustJava SwitchPoint. invalidateAll(new SwitchPoint[]{switchPoint}); String str=(String)mhDelegator.invoke("Just", "Java")); //JavaJust
  • 27. ReflectionToInvokeExample Method methodConcat = String.class. getDeclaredMethod("concat", String.class); MethodHandle mhConcat = MethodHandles.lookup().unreflect(methodConcat); System.out.println(mhConcat.invoke("Just", "Java")); //JustJava
  • 28. br.eti.castro.example. invoke.accesscontrol • ClassToAcess – publicField, protectedField, packegeField, privateField – public void publicMethod(){} – protected void protectedMethod(){} – void packageMethod(){} – private void privateMethod(){} • FieldAcessTest – Acessando e atribuindo valores • MethodAcessTest – Invocando os métodos
  • 29. br.eti.castro.example. invoke.performance • Increaser – public int increase(int i){return i++;} • ExampleDirectlyInvoke – int r = inc.increase(i); • ExampleReflect – int r = (int) method.invoke(object, param); • ExampleInvoke – int r = (int) methodHandle.invokeExact(param); • ExampleInvokeCallSite – int r = (int) mhBinded.invokeExact(param);
  • 30. Referências • JSR 292: Supporting Dynamically Typed Languages on the JavaTM Platform http://jcp.org/en/jsr/detail?id=292 • Javadoc SE 7 http://docs.oracle.com/javase/7/docs/api/ • Method Handles and Beyond… John R. Rose, Da Vinci Machine Project, JSR 292 Lead http://www.parleys.com/#id=2631&st=5 @JVMLanguageSummit2011 • MethodHandle implemention tips and tricks Dan Heidinga http://bit.ly/KtZYqb @JVMLanguageSummit2011 • Java 7: Soporte a lenguajes dinámicos Roberto Montero Miguel
  • 31. OBRIGADO! Marcelo de Castro Alexandre Castro marcelo@castro.eti.br alexandre@castro.eti.br @mcastroinfo @CastroAlexandre