Palestra realiza no JustJava 2012 no dia 19/05/2012.
Java 7 trouxe um novo bytecode (invokedynamic) e um novo pacote (java.lang.invoke) com classes para prover suporte a linguagens dinâmicas, porém o uso desta API pode trazer benefícios para o desenvolvimento de aplicativos Java que não utilizam linguagens dinâmicas, principalmente no desenvolvimento de frameworks devido a flexibilidade da API em comparação com a API de Reflection.
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)
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
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
*/
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