SlideShare uma empresa Scribd logo
1 de 31
Baixar para ler offline
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

Mais procurados

Orientação a objetos em Python (compacto)
Orientação a objetos em Python (compacto)Orientação a objetos em Python (compacto)
Orientação a objetos em Python (compacto)Luciano Ramalho
 
Iteráveis e geradores (versão RuPy)
Iteráveis e geradores (versão RuPy)Iteráveis e geradores (versão RuPy)
Iteráveis e geradores (versão RuPy)Luciano Ramalho
 
A Classe StringBuilder em Java
A Classe StringBuilder em JavaA Classe StringBuilder em Java
A Classe StringBuilder em JavaDevmedia
 
Estrutura de Dados em Java (Funções e Procedimentos)
Estrutura de Dados em Java (Funções e Procedimentos)Estrutura de Dados em Java (Funções e Procedimentos)
Estrutura de Dados em Java (Funções e Procedimentos)Adriano Teixeira de Souza
 
Curso java 04 - ap is e bibliotecas
Curso java   04 - ap is e bibliotecasCurso java   04 - ap is e bibliotecas
Curso java 04 - ap is e bibliotecasMaurício Linhares
 
Estrutura de Dados - Procedimentos e Funções
Estrutura de Dados - Procedimentos e FunçõesEstrutura de Dados - Procedimentos e Funções
Estrutura de Dados - Procedimentos e FunçõesAdriano Teixeira de Souza
 
Jython no JavaOne Latin America 2011
Jython no JavaOne Latin America 2011Jython no JavaOne Latin America 2011
Jython no JavaOne Latin America 2011Luciano Ramalho
 
Ajax O Objeto Xml Http Request Parte 3
Ajax   O Objeto Xml Http Request   Parte 3Ajax   O Objeto Xml Http Request   Parte 3
Ajax O Objeto Xml Http Request Parte 3infinitopublicidade
 
introdução a linguagem java-2003
introdução a linguagem java-2003introdução a linguagem java-2003
introdução a linguagem java-2003elliando dias
 
Curso java 03 - métodos e parâmetros
Curso java   03 - métodos e parâmetrosCurso java   03 - métodos e parâmetros
Curso java 03 - métodos e parâmetrosMaurício Linhares
 

Mais procurados (20)

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

Destaque

6. enfoque sociocultural
6. enfoque sociocultural6. enfoque sociocultural
6. enfoque socioculturalCarina Rocha
 
8 informe general
8 informe general8 informe general
8 informe generalLaura Reyes
 
Las dos nubes amigas
Las dos nubes amigasLas dos nubes amigas
Las dos nubes amigasgbosch76
 
5 formulario numero telefonico
5 formulario numero telefonico5 formulario numero telefonico
5 formulario numero telefonicoLaura Reyes
 
Menerapkan hosting Gratisan
Menerapkan hosting GratisanMenerapkan hosting Gratisan
Menerapkan hosting GratisanAbi Ahnaf
 
Las claves de un best-seller
Las claves de un best-sellerLas claves de un best-seller
Las claves de un best-sellerRaúl Lasa Calle
 
Denuncia dabeiba 21 abril
Denuncia dabeiba 21 abrilDenuncia dabeiba 21 abril
Denuncia dabeiba 21 abrilplanosur
 
Dive into .git 日本語版
Dive into .git 日本語版Dive into .git 日本語版
Dive into .git 日本語版nishio
 
Hipervínculos
HipervínculosHipervínculos
Hipervínculos980601
 
Iniciativa Cannabis ante Congreso de la Unión
Iniciativa Cannabis ante Congreso de la UniónIniciativa Cannabis ante Congreso de la Unión
Iniciativa Cannabis ante Congreso de la Uniónespacioprogresista
 
Ying Ying Huang i Bruna Vidiella
Ying Ying Huang i Bruna VidiellaYing Ying Huang i Bruna Vidiella
Ying Ying Huang i Bruna VidiellaEscola
 

Destaque (20)

Invoke dynamics
Invoke dynamicsInvoke dynamics
Invoke dynamics
 
6. enfoque sociocultural
6. enfoque sociocultural6. enfoque sociocultural
6. enfoque sociocultural
 
3721shopping.net
3721shopping.net3721shopping.net
3721shopping.net
 
8 informe general
8 informe general8 informe general
8 informe general
 
Las dos nubes amigas
Las dos nubes amigasLas dos nubes amigas
Las dos nubes amigas
 
Virgilinz 2012
Virgilinz 2012Virgilinz 2012
Virgilinz 2012
 
5 formulario numero telefonico
5 formulario numero telefonico5 formulario numero telefonico
5 formulario numero telefonico
 
Menerapkan hosting Gratisan
Menerapkan hosting GratisanMenerapkan hosting Gratisan
Menerapkan hosting Gratisan
 
Las claves de un best-seller
Las claves de un best-sellerLas claves de un best-seller
Las claves de un best-seller
 
Denuncia dabeiba 21 abril
Denuncia dabeiba 21 abrilDenuncia dabeiba 21 abril
Denuncia dabeiba 21 abril
 
Dive into .git 日本語版
Dive into .git 日本語版Dive into .git 日本語版
Dive into .git 日本語版
 
Hipervínculos
HipervínculosHipervínculos
Hipervínculos
 
Freshcotton
FreshcottonFreshcotton
Freshcotton
 
Ley de Movilidad ALDF
Ley de Movilidad ALDFLey de Movilidad ALDF
Ley de Movilidad ALDF
 
Informe empresa
Informe empresaInforme empresa
Informe empresa
 
Formulario teléfonico
Formulario teléfonicoFormulario teléfonico
Formulario teléfonico
 
Informe consulta general criterio
Informe consulta general criterioInforme consulta general criterio
Informe consulta general criterio
 
Iniciativa Cannabis ante Congreso de la Unión
Iniciativa Cannabis ante Congreso de la UniónIniciativa Cannabis ante Congreso de la Unión
Iniciativa Cannabis ante Congreso de la Unión
 
Ying Ying Huang i Bruna Vidiella
Ying Ying Huang i Bruna VidiellaYing Ying Huang i Bruna Vidiella
Ying Ying Huang i Bruna Vidiella
 
Slideshare
SlideshareSlideshare
Slideshare
 

Semelhante a java.lang.invoke API

Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010rafaelferreira
 
Threads 07: Sincronizadores
Threads 07: SincronizadoresThreads 07: Sincronizadores
Threads 07: SincronizadoresHelder da Rocha
 
Teste unitário
Teste unitárioTeste unitário
Teste unitáriodist_bp
 
Threads 10: CompletableFuture
Threads 10: CompletableFutureThreads 10: CompletableFuture
Threads 10: CompletableFutureHelder da Rocha
 
Testes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusTestes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusDenis L Presciliano
 
Curso java 01 - molhando os pés com java
Curso java   01 - molhando os pés com javaCurso java   01 - molhando os pés com java
Curso java 01 - molhando os pés com javaMaurício Linhares
 
As Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoAs Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoPaulo Morgado
 
Threads 04 Variáveis atômicas
Threads 04 Variáveis atômicasThreads 04 Variáveis atômicas
Threads 04 Variáveis atômicasHelder da Rocha
 
Classe integer-float-byte-short-long-double
Classe integer-float-byte-short-long-doubleClasse integer-float-byte-short-long-double
Classe integer-float-byte-short-long-doublePAULO Moreira
 
Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...
Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...
Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...Daniel Sobral
 
Vraptor - Alta produtividade no Desenvolvimento Web em Java
Vraptor - Alta produtividade no Desenvolvimento Web em JavaVraptor - Alta produtividade no Desenvolvimento Web em Java
Vraptor - Alta produtividade no Desenvolvimento Web em JavaKaio Valente
 
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0Elvis Rocha
 

Semelhante a java.lang.invoke API (20)

Algoritmos de ordenação
Algoritmos de ordenaçãoAlgoritmos de ordenação
Algoritmos de ordenação
 
Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010
 
Threads 07: Sincronizadores
Threads 07: SincronizadoresThreads 07: Sincronizadores
Threads 07: Sincronizadores
 
Teste unitário
Teste unitárioTeste unitário
Teste unitário
 
Java annotation
Java annotationJava annotation
Java annotation
 
Java 8 - New Features
Java 8 - New FeaturesJava 8 - New Features
Java 8 - New Features
 
Mock Objects
Mock ObjectsMock Objects
Mock Objects
 
Threads 10: CompletableFuture
Threads 10: CompletableFutureThreads 10: CompletableFuture
Threads 10: CompletableFuture
 
Testes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusTestes em Aplicações Web com Cactus
Testes em Aplicações Web com Cactus
 
Curso java 01 - molhando os pés com java
Curso java   01 - molhando os pés com javaCurso java   01 - molhando os pés com java
Curso java 01 - molhando os pés com java
 
ESTRUTURA DE DADOS (JAVA) AULA 09
ESTRUTURA DE DADOS (JAVA) AULA 09ESTRUTURA DE DADOS (JAVA) AULA 09
ESTRUTURA DE DADOS (JAVA) AULA 09
 
Hibernate
HibernateHibernate
Hibernate
 
As Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoAs Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPonto
 
Aula 4 php
Aula 4 phpAula 4 php
Aula 4 php
 
Threads 04 Variáveis atômicas
Threads 04 Variáveis atômicasThreads 04 Variáveis atômicas
Threads 04 Variáveis atômicas
 
Aula4
Aula4Aula4
Aula4
 
Classe integer-float-byte-short-long-double
Classe integer-float-byte-short-long-doubleClasse integer-float-byte-short-long-double
Classe integer-float-byte-short-long-double
 
Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...
Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...
Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...
 
Vraptor - Alta produtividade no Desenvolvimento Web em Java
Vraptor - Alta produtividade no Desenvolvimento Web em JavaVraptor - Alta produtividade no Desenvolvimento Web em Java
Vraptor - Alta produtividade no Desenvolvimento Web em Java
 
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
 

java.lang.invoke API

  • 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