Jython no JavaOne Latin America 2011

1,216 views
1,124 views

Published on

Apresentação sobre Jython, Python em Java, feita no JavaOne Latin America 2011 em São Paulo

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,216
On SlideShare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
31
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Jython no JavaOne Latin America 2011

  1. 1. Scripting e desenvolvimento ágil de aplicações Java EE com Jython Luciano Ramalho Rafael Nunes ramalho@turing.com.br rafael@yaw.com.br @luciano @rafanunesWednesday, December 21, 2011
  2. 2. Exemplo: relógio Java Swing # coding: utf-8 from javax.swing import * from java.awt import Font from time import strftime class Relogio(JFrame): def __init__(self): JFrame.__init__(self, uTicTac, defaultCloseOperation = JFrame.DISPOSE_ON_CLOSE) self.mostrador = JLabel(00:00:00, font=Font(Sanserif,Font.BOLD, 70)) Função self.contentPane.add(self.mostrador) self.pack() callback self.visible = True como def start(self): def tic(evento): agora = strftime(%H:%M:%S) listener if self.mostrador.text != agora: self.mostrador.text = agora Timer(100, tic).start() if __name__==__main__: rel = Relogio() rel.start()Wednesday, December 21, 2011
  3. 3. Exemplo: relógio Java Swing from jrelogio import Relogio rel = Relogio() rel.start() from java.awt import * rel.mostrador.foreground = Color.RED print rel.mostrador.text from time import sleep while True: if rel.mostrador.text.endswith(0): print PING, rel.mostrador.text sleep(1)Wednesday, December 21, 2011
  4. 4. éWednesday, December 21, 2011
  5. 5. Sobre Python Linguagem de uso geral Web, desktop, redes, computação gráfica e científica Multi-plataforma Linux, Windows, Mac, Unix, Nokia S-60... Amplo suporte de fornecedores de TI Google, IBM, Oracle, Microsoft, RedHat, Amazon... Sintaxe simples e clara mas muito expressiva Aprendizagem rápida, produtividade em diasWednesday, December 21, 2011
  6. 6. Exemplo: cliente Twitter # coding: utf-8 import sys import urllib import simplejson as json if len(sys.argv) == 2: busca = sys.argv[1] else: print Informe o texto da busca: %s "texto" % __file__ sys.exit(1) url = http://search.twitter.com/search.json?q=+busca resposta = urllib.urlopen(url).read() documento = json.loads(resposta) resultados = documento[results] for resultado in resultados: print u%(from_user)s: %(text)sn % resultado print %s resuldados exibidos % len(resultados)Wednesday, December 21, 2011
  7. 7. Exemplo: planilha class Planilha: _cels = {} def __init__(self, **funcs): self._funcs = funcs def __setitem__(self, chave, formula): self._cels[chave] = formula def formula(self, chave): return self._cels[chave] def __getitem__(self, chave ): return eval(self._cels[chave], self._funcs, self) >>> from math import pi, sin >>> from planilha import Planilha >>> p = Planilha(sin=sin, pi=pi) >>> p[a1] = .5 >>> p[a2] = pi >>> p[b1] = a1*a2 >>> p[b2] = sin(b1) >>> p[b2] 1.0Wednesday, December 21, 2011
  8. 8. Quem usa Python?Wednesday, December 21, 2011
  9. 9. Wednesday, December 21, 2011
  10. 10. Wednesday, December 21, 2011
  11. 11. Wednesday, December 21, 2011
  12. 12. Wednesday, December 21, 2011
  13. 13. Áreas de aplicação desenvolvimento Web computação gráfica administração de sistemas integração de sistemas (glue language) computação científica gamesWednesday, December 21, 2011
  14. 14. YouTubeWednesday, December 21, 2011
  15. 15. Wednesday, December 21, 2011 Globo.com usa Django
  16. 16. Mozilla Firefox Add-OnsWednesday, December 21, 2011
  17. 17. DropboxWednesday, December 21, 2011
  18. 18. Google App EngineWednesday, December 21, 2011
  19. 19. The Foundry, NUKEWednesday, December 21, 2011
  20. 20. Industrial Light & MagicWednesday, December 21, 2011
  21. 21. Autodesk MayaWednesday, December 21, 2011
  22. 22. InvesaliusWednesday, December 21, 2011
  23. 23. FBI e CIAWednesday, December 21, 2011
  24. 24. brasil.gov.brWednesday, December 21, 2011
  25. 25. Projetos Open SourceWednesday, December 21, 2011
  26. 26. Características Não obriga a declarar variáveis, mas obriga a inicializar >>> a = 10 >>> c = a + b Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name b is not definedWednesday, December 21, 2011
  27. 27. Características 2 Tipagem dinâmica forte, obriga conversões explícitas >>> a = 9 >>> b = 10 >>> c = a + b Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot concatenate str and int objectsWednesday, December 21, 2011
  28. 28. Características 3 Orientada a objetos, mas não obriga a criar classes Suporta sobrecarga de operadores e herança múltipla Usa exceções, mas não obriga a declarar ou tratar Usa namespaces, módulos e pacotes Compilada para bytecode Suporte nativo a propertiesWednesday, December 21, 2011
  29. 29. Exemplo: property read-only class ItemPedido(object): def __init__(self, descr, pr_unit, qtd): self.descr = descr self.pr_unit = pr_unit self.qtd = qtd @property def total(self): return self.pr_unit * self.qtd >>> bolas = ItemPedido(bola, 3.1, 10) >>> bolas.descr bola >>> bolas.total 31.0 >>> bolas.total = 30 Traceback (most recent call last): ... AttributeError: cant set attributeWednesday, December 21, 2011
  30. 30. Exemplo: property read-write class ItemPedido(object): def __init__(self, descr, pr_unit, qtd): self.descr = descr self.pr_unit = pr_unit self.qtd = qtd @property def total(self): return self.pr_unit * self.qtd @property def qtd(self): return self.__qtd @qtd.setter def qtd(self, valor): if valor < 1: raise ValueError(quantidade < 1) else: self.__qtd = valorWednesday, December 21, 2011
  31. 31. >>> bolas = ItemPedido(bola, 3.1, 10) Propriedade >>> bolas.descr bola (exemplo 2) >>> bolas.total 31.0 >>> bolas.qtd = -3 Traceback (most recent call last):class ItemPedido(object): ... ValueError: quantidade < 1 def __init__(self, descr, pr_unit, qtd): self.descr = descr >>> duendes = ItemPedido(duende, 999, 0) Traceback (most recent call last): self.pr_unit = pr_unit self.qtd = qtd ... ValueError: quantidade < 1 @property def total(self): return self.pr_unit * self.qtd @property def qtd(self): return self.__qtd @qtd.setter def qtd(self, valor): if valor < 1: raise ValueError(quantidade < 1) else: self.__qtd = valorWednesday, December 21, 2011
  32. 32. Implementações CPython: o interpretador python padrão, implementando em C pré-instalado na maioria dos Linux e no OSX Jython: implementado em Java, roda sobre a JVM IronPython: implementado em C#, roda sobre .net CLR PyPy: implementado em Python, compilação JITWednesday, December 21, 2011
  33. 33. Jython falando com JavaWednesday, December 21, 2011
  34. 34. Jython no ambiente Java EE Jython é a principal linguagem de scripting suportada e documentada nos produtos: Oracle WebLogic IBM WebSphereWednesday, December 21, 2011
  35. 35. Introspecção e Reflexão Uma classe Java com dois atributos privados public class ObjetoSecreto { ! private String escondido = ""; ! private String oculto = "dado ultra secreto"; ! public ObjetoSecreto(String texto) { ! ! this.escondido = texto; ! } }Wednesday, December 21, 2011
  36. 36. Acesso a atributo privado import java.lang.reflect.Field; Java public class AcessaPrivado { ! public static void main(String[] args) { ! ! ObjetoSecreto oSecreto = new ObjetoSecreto("senha super secreta"); ! ! Field campoPrivado = null; ! ! try { ! ! ! campoPrivado = ObjetoSecreto.class.getDeclaredField("escondido"); ! ! } ! ! catch (NoSuchFieldException e) { ! ! ! System.err.println(e); ! ! ! System.exit(1); ! ! } ! ! ! campoPrivado.setAccessible(true); // arrombamos a porta ! try { Python ! ! ! String tavaEscondido = (String) campoPrivado.get(oSecreto); ! ! ! System.out.println("oSecreto.escondido = " + tavaEscondido); ! ! } ! ! catch (IllegalAccessException e) { import ObjetoSecreto ! ! ! // esta exceção nao acontece porque fizemos setAcessible(true) ! ! ! System.err.println(e); = ObjetoSecreto(senha super secreta) oSecreto ! ! }! campoPrivado = ObjetoSecreto.getDeclaredField(escondido) ! } campoPrivado.setAccessible(True) # arrombamos a porta } print oSecreto.escondido =, campoPrivado.get(oSecreto)Wednesday, December 21, 2011
  37. 37. Acesso a atributo privado 2 import ObjetoSecreto oSecreto = ObjetoSecreto(senha super secreta) campoPrivado = ObjetoSecreto.getDeclaredField(escondido) campoPrivado.setAccessible(True) # arrombamos a porta print oSecreto.escondido =, campoPrivado.get(oSecreto) from java.lang.reflect import Modifier listar import ObjetoSecreto todos os atributos oSecreto = ObjetoSecreto(senha super secreta) campos = ObjetoSecreto.getDeclaredFields() for campo in campos: # so campos privados! privados if Modifier.isPrivate(campo.getModifiers()): print campo campo.setAccessible(True) # arrombamos a porta print t, campo.getName(), =, campo.get(oSecreto)Wednesday, December 21, 2011
  38. 38. Exemplo: relógio Java Swing Java bean from javax.swing import * from java.awt import Font setter from time import strftime acionado frame = JFrame(uRelógio, no defaultCloseOperation = JFrame.EXIT_ON_CLOSE) construtor rel = JLabel(00:00:00, font=Font(Sanserif,Font.BOLD,70)) e frame.contentPane.add(rel) frame.pack() setter frame.visible = True acionado def tic(evento): como agora = strftime(%H:%M:%S) if rel.text != agora: property rel.text = agora Timer(100, tic).start()Wednesday, December 21, 2011
  39. 39. Onde aprender mais jython.org Jython book livre (CC) python.org python.org.br Google Groups: python-brasilWednesday, December 21, 2011
  40. 40. Academia Python Globalcode A partir de janeiro de 2012 em SP 112h de aula do básico ao avançado em 3,5 mesesWednesday, December 21, 2011

×