O documento apresenta exemplos de como usar a linguagem Python para desenvolvimento de aplicações Java EE, incluindo um relógio em Swing e acesso a atributos privados de objetos Java usando reflexão.
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 @rafanunes
Wednesday, December 21, 2011
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, u'TicTac',
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. 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
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 dias
Wednesday, December 21, 2011
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. 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.0
Wednesday, December 21, 2011
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
games
Wednesday, December 21, 2011
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 defined
Wednesday, December 21, 2011
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' objects
Wednesday, December 21, 2011
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 properties
Wednesday, December 21, 2011
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 JIT
Wednesday, December 21, 2011
34. Jython no ambiente Java EE
Jython é a principal linguagem
de scripting suportada e
documentada nos produtos:
Oracle WebLogic
IBM WebSphere
Wednesday, December 21, 2011
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. 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. 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. Exemplo: relógio Java Swing
Java bean from javax.swing import *
from java.awt import Font
setter from time import strftime
acionado frame = JFrame(u'Reló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. Onde aprender
mais
jython.org
Jython book livre (CC)
python.org
python.org.br
Google Groups: python-brasil
Wednesday, December 21, 2011
40. Academia
Python
Globalcode
A partir de janeiro
de 2012 em SP
112h de aula
do básico ao
avançado em
3,5 meses
Wednesday, December 21, 2011