<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CODARE &#187; Java</title>
	<atom:link href="http://codare.net/category/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://codare.net</link>
	<description>Programadores, uni-vos!</description>
	<lastBuildDate>Fri, 03 Dec 2010 21:34:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Java: Transformar objeto em XML</title>
		<link>http://codare.net/2009/03/31/java-transformar-objeto-em-xml/</link>
		<comments>http://codare.net/2009/03/31/java-transformar-objeto-em-xml/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 12:00:02 +0000</pubDate>
		<dc:creator>Tiago Barcellos Peczenyj</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[objeto]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XStream]]></category>

		<guid isPermaLink="false">http://codare.net/?p=260</guid>
		<description><![CDATA[Dizem que, em Java, tudo é muito complicado. Lidar com arquivos XML então, nem se fala. Agora imagine isso: MinhaClasse objeto = new MinhaClasse(parametros); Perfeito, instanciei um objeto da minha classe. Vamos transformar em XML rapidinho? XStream xstream = new XStream(new DomDriver()); String &#8230; <a href="http://codare.net/2009/03/31/java-transformar-objeto-em-xml/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Dizem que, em Java, tudo é muito complicado. Lidar com arquivos XML então, nem se fala. Agora imagine isso:</p>
<pre>MinhaClasse objeto = new MinhaClasse(parametros);</pre>
<p>Perfeito, instanciei um objeto da minha classe. Vamos transformar em XML rapidinho?</p>
<pre>XStream xstream = new XStream(new DomDriver());
String xml = xstream.toXML(objeto);</pre>
<p>O responsável por esta mágica é o XStream, que pode ser encontrado em <a href="http://xstream.codehaus.org/" target="_blank">http://xstream.codehaus.org/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://codare.net/2009/03/31/java-transformar-objeto-em-xml/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Java: NoClassDefFoundError e ClassNotFoundException</title>
		<link>http://codare.net/2007/07/16/java-noclassdeffounderror-e-classnotfoundexception/</link>
		<comments>http://codare.net/2007/07/16/java-noclassdeffounderror-e-classnotfoundexception/#comments</comments>
		<pubDate>Mon, 16 Jul 2007 12:30:26 +0000</pubDate>
		<dc:creator>João Del Valle</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://codare.net/2007/07/16/java-noclassdeffounderror-e-classnotfoundexception/</guid>
		<description><![CDATA[Palavras-chave: Java, classes não encontradas, classpath Os erros NoClassDefFoundError e ClassNotFoundException acontecem com frequência em aplicações Java e é importante entendê-los com clareza, a fim de diagnosticar problemas mais rapidamente. Ambos os erros significam essencialmente a mesma coisa: uma classe &#8230; <a href="http://codare.net/2007/07/16/java-noclassdeffounderror-e-classnotfoundexception/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Palavras-chave: Java, classes não encontradas, classpath</p>
<p>Os erros NoClassDefFoundError e ClassNotFoundException acontecem com frequência em aplicações Java e é importante entendê-los com clareza, a fim de diagnosticar problemas mais rapidamente.</p>
<p>Ambos os erros significam essencialmente a mesma coisa: uma classe não foi encontrada. A diferença é a maneira de que esta classe estava sendo procurada.</p>
<p>No caso do <strong>NoClassDefFoundError</strong>, a JVM estava tentando carregar uma classe para invocar um método ou criar uma instância e não a encontrou. Isso acontece tipicamente quando a JVM encontra uma referência a uma classe que ainda não foi carregada.</p>
<p>Para provocar isso como exemplo, crie um programa com duas classes, chamadas Main e Pessoa:</p>
<pre>
public class Main {
  public static void main(String[] args) {
    new Pessoa();
  }
}
class Pessoa {}
</pre>
<p>Compile este código manualmente (javac *.java) e execute-o. O programa deve rodar sem nenhum problema. Agora, remova o arquivo gerado chamado Pessoa.class e re-execute o programa. Isso gerará uma saída parecida com esta:</p>
<pre>
# java Main
Exception in thread "main" java.lang.NoClassDefFoundError: Pessoa
        at Main.main(Main.java:3)
</pre>
<p>Quando você compilou o código, a classe Pessoa estava também sendo compilada (ela poderia estar no classpath) e instrução &#8216;new&#8217; fez uma referência direta a ela. No momento de executar o código, a classe Pessoa não estava mais disponível. Isso é um erro inesperado, portanto NoClassDefFoundError é um java.lang.Error.</p>
<p>Já a <strong>ClassNotFoundException</strong> é uma java.lang.Exception, um tipo de erro mais &#8220;suave&#8221;. Esta exceção acontece quando alguma parte do código (seu ou de alguma classe que você utiliza) está carregando explicitamente uma classe, através de métodos como Class.forName(), ClassLoader.findSystemClass() ou ClassLoader.loadClass(). Neste caso, o código não precisa ter sido compilado junto a classe referenciada.</p>
<p>Considere o exemplo a seguir:</p>
<pre>
public class Main {
  public static void main(String[] args) throws Exception {
    Object o = Class.forName("pacote.NaoExiste").newInstance();
  }
}
</pre>
<p>Isso produzirá uma saída parecida com:</p>
<pre>
# java Main
Exception in thread "main" java.lang.ClassNotFoundException: pacote.NaoExiste
        at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
        at java.security.AccessController.doPrivileged(Native Method)
</pre>
<p>No momento da compilação, a classe não estava presente, mas o código foi compilado sem problemas. Na execução, porém, a ausência da classe fez o carregamento explícito falhar.</p>
]]></content:encoded>
			<wfw:commentRss>http://codare.net/2007/07/16/java-noclassdeffounderror-e-classnotfoundexception/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Java: Enviar emails com autenticação (SMTP)</title>
		<link>http://codare.net/2007/05/21/java-enviar-emails-com-autenticacao-smtp-ok/</link>
		<comments>http://codare.net/2007/05/21/java-enviar-emails-com-autenticacao-smtp-ok/#comments</comments>
		<pubDate>Mon, 21 May 2007 12:30:06 +0000</pubDate>
		<dc:creator>João Del Valle</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://codare.net/2007/05/18/java-enviar-emails-com-autenticacao-smtp-ok/</guid>
		<description><![CDATA[Palavras-chave: Java, JavaMail, email, SMTP, SMTP autenticado Enviar emails é uma tarefa corriqueira, mas sempre precisamos olhar um exemplo da JavaMail API para montar uma classe utilitária. A seguir, um exemplo mínimo do envio de emails através de um servidor &#8230; <a href="http://codare.net/2007/05/21/java-enviar-emails-com-autenticacao-smtp-ok/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Palavras-chave: Java, JavaMail, email, SMTP, SMTP autenticado</p>
<p>Enviar emails é uma tarefa corriqueira, mas sempre precisamos olhar um exemplo da JavaMail API para montar uma classe utilitária. A seguir, um exemplo mínimo do envio de emails através de um servidor SMTP autenticado:</p>
<pre>
public void enviarEmail(String emailDest, String nomeDest,
  String emailRemet, String nomeRemet, String assunto, String corpo)
  throws Exception {
  Properties props = System.getProperties();
  props.put("mail.smtp.host", "smtp.firma.com.br");
  props.put("mail.smtp.auth", "true");
  Authenticator auth = new Authenticator() {
    public PasswordAuthentication getPasswordAuthentication() {
      return new PasswordAuthentication("fulano", "suasenha");
    }};

  Session session = Session.getInstance(props, auth);
  MimeMessage message = new MimeMessage(session);
  message.setFrom(new InternetAddress(emailRemet, nomeRemet));
  message.addRecipient(Message.RecipientType.TO,
    new InternetAddress(emailDest, nomeDest));
  message.setSubject(assunto);
  message.setContent(corpo, "text/plain");

  Transport.send(message);
}
</pre>
<p>Para executar este código, é preciso colocar o JavaMail (<a href="http://java.sun.com/products/javamail/downloads/index.html">mail.jar</a>) e o Java Activation Framework (<a href="http://java.sun.com/products/javabeans/jaf/downloads/index.html">activation.jar</a>) em seu classpath. Se você usa Java 6, não vai precisar do JAF no classpath, pois este foi embutido nesta versão do Java.</p>
<p>Para testar o código, pode-se fazer algo como:</p>
<pre>
enviarEmail("todos@firma.com.br", "Lista da Firma", "fulano@firma.com.br",
  "Fulano da Silva", "Codare", "Gosto do Codare. E vocês?");
</pre>
<p>Se você usa emails dentro de Servidores de Aplicação, pode fazer lookup da sessão no JNDI, ao invés de criá-la passando as propriedades. Você a receberá com as propriedades setadas pelo administrador do ambiente e, como desenvolvedor, não precisará se preocupar com coisas como &#8220;qual é o servidor de email do ambiente de produção&#8221;:</p>
<pre>
Session session =
  (Session) new InitialContext().lookup("java:comp/env/mail/Sessao");
</pre>
]]></content:encoded>
			<wfw:commentRss>http://codare.net/2007/05/21/java-enviar-emails-com-autenticacao-smtp-ok/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Java: Fazer ping em um servidor</title>
		<link>http://codare.net/2007/05/09/java-fazer-ping-em-um-servidor/</link>
		<comments>http://codare.net/2007/05/09/java-fazer-ping-em-um-servidor/#comments</comments>
		<pubDate>Wed, 09 May 2007 16:22:13 +0000</pubDate>
		<dc:creator>João Del Valle</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://codare.net/2007/05/09/java-fazer-ping-em-um-servidor/</guid>
		<description><![CDATA[Palavras-chave: ping, ICMP, java.net.InetAddress, isReachable, Java 5 A partir do Java 5, fazer ping em um servidor usando Java ficou bastante simples. É só usar o método isReachable da classe java.net.InetAddress. O método a seguir usa isReachable para pingar um &#8230; <a href="http://codare.net/2007/05/09/java-fazer-ping-em-um-servidor/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Palavras-chave: ping, ICMP, java.net.InetAddress, isReachable, Java 5</p>
<p>A partir do Java 5, fazer ping em um servidor usando Java ficou bastante simples. É só usar o método isReachable da classe java.net.InetAddress.</p>
<p>O método a seguir usa isReachable para pingar um servidor com tempo limite de cinco segundos (timeout igual a 5000 milisegundos):</p>
<pre>
private static void pingar(String host) {
  try {
    if (InetAddress.getByName(host).isReachable(5000))
      System.out.println("Ping OK: " + host);
    else
      System.out.println("Ping FALHOU: " + host);
  } catch (Exception e) {
    System.err.println("Ping FALHOU: " + host + " - " + e);
  }
}
</pre>
<p>Podemos testar este código da seguinte maneira:</p>
<pre>
pingar("www.google.com");
pingar("localhost");
pingar("www.umgooglequenaoexiste.com");
</pre>
<p>E uma possível execução é:</p>
<pre>
Ping FALHOU: www.google.com
Ping OK: localhost
Ping FALHOU: www.umgooglequenaoexiste.com -
	java.net.UnknownHostException: www.umgooglequenaoexiste.com
</pre>
<p>Neste caso, o servidor do Google foi encontrado no DNS, mas não se conseguiu pingá-lo. O host local pingou fácil e o último nome não foi encontrado no DNS.</p>
<p>O método isReachable funciona como um ping, mas é um pouco mais que isso. A implementação normalmente tentará enviar uma mensagem ICMP Echo Request. Caso não consiga, tentará abrir uma conexão TCP à porta 7.</p>
]]></content:encoded>
			<wfw:commentRss>http://codare.net/2007/05/09/java-fazer-ping-em-um-servidor/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Java: classpath com caracteres curinga (wildcards)</title>
		<link>http://codare.net/2007/05/01/java-classpath-com-caracteres-curinga-wildcards/</link>
		<comments>http://codare.net/2007/05/01/java-classpath-com-caracteres-curinga-wildcards/#comments</comments>
		<pubDate>Tue, 01 May 2007 13:19:38 +0000</pubDate>
		<dc:creator>João Del Valle</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://codare.net/2007/05/01/java-classpath-com-caracteres-curinga-wildcards/</guid>
		<description><![CDATA[Palavras-chave: classpath, wildcards, caractere curinga, Java 6 O Java 6 trouxe um recurso para facilitar a vida do programador: os caracteres curinga (wildcards) na definição do classpath. O que antes você fazia assim: java -cp lib/codare-main.jar:lib/codare-utils.jar:lib/mail.jar \\ codare.MinhaClasse Hoje pode &#8230; <a href="http://codare.net/2007/05/01/java-classpath-com-caracteres-curinga-wildcards/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Palavras-chave: classpath, wildcards, caractere curinga, Java 6</p>
<p>O Java 6 trouxe um recurso para facilitar a vida do programador: os caracteres curinga (wildcards) na definição do classpath. O que antes você fazia assim:</p>
<pre>
java -cp lib/codare-main.jar:lib/codare-utils.jar:lib/mail.jar \\
	codare.MinhaClasse
</pre>
<p>Hoje pode fazer assim:</p>
<pre>
java -cp lib/\\* codare.MinhaClasse
</pre>
<p>Isso incluirá todos os arquivos *.jar dentro do diretório lib. Note bem: apenas os jars. Se você precisar de arquivos .class em diretórios, terá que incluí-los no classpath pela maneira tradicional:</p>
<pre>
java -cp lib/\\*:classes codare.MinhaClasse
</pre>
<p>Note também:</p>
<ul>
<li>A barra invertida (\) é apenas um caractere de escape para que o shell não faça a expansão do asterisco (*).
</li>
<li>A ordem dos arquivos .jar no classpath não é garantida.
</li>
<li>Este recurso, apesar de suportado pelo JDK 6 da Sun, não faz parte da especificação da JVM, portanto, você pode não encontrá-lo em outras implementações.
</li>
<li>Os curingas são expandidos na inicialização da VM. Assim, não adianta colocar novos arquivos .jar seguindo o padrão sem reiniciar a VM.
</li>
</ul>
<p>Porém, atenção: na versão atual, os caracteres curingas da JVM não são tão espertos como os do shell. A chamada a seguir, por exemplo, não funcionaria:</p>
<pre>
$ java -cp lib/\\*.jar codare.MinhaClasse
Exception in thread "main" java.lang.NoClassDefFoundError:
   codare.MinhaClasse
</pre>
<p>Último detalhe: estes exemplos consideram um shell tipo UNIX. Em ambientes Windows, confesso, não consegui achar um comportamento previsível.</p>
]]></content:encoded>
			<wfw:commentRss>http://codare.net/2007/05/01/java-classpath-com-caracteres-curinga-wildcards/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Java: Como ler, editar e salvar imagens (ImageIO)</title>
		<link>http://codare.net/2007/03/15/java-como-ler-editar-e-salvar-imagens-imageio/</link>
		<comments>http://codare.net/2007/03/15/java-como-ler-editar-e-salvar-imagens-imageio/#comments</comments>
		<pubDate>Thu, 15 Mar 2007 12:00:17 +0000</pubDate>
		<dc:creator>João Del Valle</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://codare.net/2007/03/15/java-como-ler-editar-e-salvar-imagens-imageio/</guid>
		<description><![CDATA[Palavras-chave: imagem, imagens, ler, salvar, carregar, editar, JPG, JPEG, GIF, PNG, imageio Ler e escrever arquivos de imagens em Java é tão fácil que até nem parece Java: BufferedImage imagem = ImageIO.read(new File("mariabonita.gif")); // fazer algo com a imagem... ImageIO.write(imagem, &#8230; <a href="http://codare.net/2007/03/15/java-como-ler-editar-e-salvar-imagens-imageio/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Palavras-chave: imagem, imagens, ler, salvar, carregar, editar, JPG, JPEG, GIF, PNG, imageio</p>
<p>Ler e escrever arquivos de imagens em Java é tão fácil que até nem parece Java:</p>
<pre>
BufferedImage imagem = ImageIO.read(new File("mariabonita.gif"));
// fazer algo com a imagem...
ImageIO.write(imagem, "PNG", new File("mariabonita.png"));
</pre>
<p>Já que foi fácil, vamos aproveitar esta dica para aprender também como alterar os pixels da imagem. Para isso, use os métodos getRGB()/setRGB() da classe BufferedImage. O método getRGB() retorna um array de int que representa os valores RGB de cada ponto da imagem.</p>
<p>Se você tivesse uma matriz, você poderia referenciar os pixels como matriz[lin][col]. Mas, aqui, como na maioria dos programas de processamento de imagens, temos um array para representar a imagem. Assim, temos que usar a notação pixels[w * lin + col], onde w é a largura da imagem.</p>
<p>O exemplo a seguir lê uma imagem, colore-a de maneira aleatório-psicodélica e a salva em outro arquivo:</p>
<pre>
BufferedImage imagem = ImageIO.read(new File("qualquer.jpg"));
int w = imagem.getWidth();
int h = imagem.getHeight();
int[] pixels = imagem.getRGB(0, 0, w, h, null, 0, w);
Random r = new Random();

for (int col = 0; col &lt; w; col++) {
  for (int lin = 0; lin &lt; h; lin++) {
    pixels[w * lin + col] =
      new Color(r.nextInt(255), col % 255, lin % 255).getRGB();
  }
}

imagem.setRGB(0, 0, w, h, pixels, 0, w);
ImageIO.write(imagem, "PNG", new File("arteabstrata.png"));
</pre>
]]></content:encoded>
			<wfw:commentRss>http://codare.net/2007/03/15/java-como-ler-editar-e-salvar-imagens-imageio/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Java: Listando os processos em execução na máquina (jps)</title>
		<link>http://codare.net/2007/03/08/java-listando-os-processos-em-execucao-na-maquina-jps/</link>
		<comments>http://codare.net/2007/03/08/java-listando-os-processos-em-execucao-na-maquina-jps/#comments</comments>
		<pubDate>Thu, 08 Mar 2007 14:09:18 +0000</pubDate>
		<dc:creator>João Del Valle</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://codare.net/2007/03/08/java-listando-os-processos-em-execucao-na-maquina-jps/</guid>
		<description><![CDATA[Palavras-chave: Java, jps, listagem de processos, parâmetros da JVM O JDK 6 fornece algumas ferramentas de monitoração e diagnóstico de problemas que podem ser úteis no dia-a-dia de um ambiente de produção. A mais básica delas é o jps, que &#8230; <a href="http://codare.net/2007/03/08/java-listando-os-processos-em-execucao-na-maquina-jps/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Palavras-chave: Java, jps, listagem de processos, parâmetros da JVM</p>
<p>O JDK 6 fornece algumas ferramentas de monitoração e diagnóstico de problemas que podem ser úteis no dia-a-dia de um ambiente de produção. A mais básica delas é o jps, que lista todos os processos Java que estão sendo executados na máquina.</p>
<p>Por exemplo, executando-se o comando sem parâmetros, são listados os identificadores (PIDs) e os nomes das classes que inicializaram cada processo (aquelas cujo método main foi chamado):</p>
<pre>
$ jps
12647 startup.jar
12777 Bootstrap
12972 Jps
</pre>
<p>Se você já sabe quais programas estão executando, provavelmente, só esta informação já lhe será suficiente. Mas, se quer mais detalhes, pode tentar as opções -l e -v, que mostram o nome completo da classe principal e os parâmetros da JVM:</p>
<pre>
$ jps -lv
12647 /opt/eclipse/./startup.jar -Xms40m -Xmx256m
12777 org.apache.catalina.startup.Bootstrap -Djava.util.lo...
13012 sun.tools.jps.Jps -Dapplication.home=/usr/lib/jvm/ja...
</pre>
<p>Nestes exemplos, os processos Java da máquina eram Eclipse (pid 12647), Tomcat (12777) e o próprio jps (12972 e 13012). Observe que a listagem de parâmetros foi abreviada.</p>
]]></content:encoded>
			<wfw:commentRss>http://codare.net/2007/03/08/java-listando-os-processos-em-execucao-na-maquina-jps/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Java: Métodos com argumentos variáveis</title>
		<link>http://codare.net/2007/02/14/java-metodos-com-argumentos-variaveis/</link>
		<comments>http://codare.net/2007/02/14/java-metodos-com-argumentos-variaveis/#comments</comments>
		<pubDate>Wed, 14 Feb 2007 12:00:08 +0000</pubDate>
		<dc:creator>João Del Valle</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://codare.net/2007/02/14/metodos-com-argumentos-variaveis/</guid>
		<description><![CDATA[Palavras-chave: Java 5, varargs, argumentos variáveis A versão 5 da plataforma Java trouxe um recurso muito comum em diversas outras linguagens: número variável de argumentos na chamada de métodos. A sintaxe é simples e intuitiva: public class Varargs { public &#8230; <a href="http://codare.net/2007/02/14/java-metodos-com-argumentos-variaveis/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Palavras-chave: Java 5, varargs, argumentos variáveis</p>
<p>A versão 5 da plataforma Java trouxe um recurso muito comum em diversas outras linguagens: número variável de argumentos na chamada de métodos.</p>
<p>A sintaxe é simples e intuitiva:</p>
<pre>
public class Varargs {

  public static void main(String[] args) {
    imprimirTipos("123", 123, 123F, 123L);
  }

  public static void imprimirTipos(Object... params) {
    for (Object objeto : params) {
      System.out.println(objeto.getClass().getName());
    }
    System.out.println("Número de parâmetros: "
      + params.length);
  }
}
</pre>
<p>No corpo do método, o parâmetro de tamanho variável é visto como um array. Assim, nosso breve exemplo produzirá:</p>
<pre>
java.lang.String
java.lang.Integer
java.lang.Float
java.lang.Long
Número de parâmetros: 4
</pre>
]]></content:encoded>
			<wfw:commentRss>http://codare.net/2007/02/14/java-metodos-com-argumentos-variaveis/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Java: Gerando códigos hash (MD5, SHA)</title>
		<link>http://codare.net/2007/02/02/java-gerando-codigos-hash-md5-sha/</link>
		<comments>http://codare.net/2007/02/02/java-gerando-codigos-hash-md5-sha/#comments</comments>
		<pubDate>Fri, 02 Feb 2007 11:48:27 +0000</pubDate>
		<dc:creator>João Del Valle</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://codare.net/2007/02/02/gerando-codigos-hash-md5-sha/</guid>
		<description><![CDATA[Palavras-chave: Java, hash, MD5, SHA-1, SHA-256, MessageDigest A maneira mais comum de se gerar um código hash em Java é utilizando a classe java.security.MessageDigest. O método a seguir gera o hash MD5 de uma string: MessageDigest md = MessageDigest.getInstance("MD5"); md.update(frase.getBytes()); &#8230; <a href="http://codare.net/2007/02/02/java-gerando-codigos-hash-md5-sha/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Palavras-chave: Java, hash, MD5, SHA-1, SHA-256, MessageDigest</p>
<p>A maneira mais comum de se gerar um código hash em Java é utilizando a classe java.security.MessageDigest. O método a seguir gera o hash MD5 de uma string:</p>
<pre>
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(frase.getBytes());
byte[] hashMd5 = md.digest();
</pre>
<p>O hash é retornado como um array de bytes, que pode ser impresso utilizando o método citado em um <a href="/2007/01/04/java-impressao-de-bytes-como-hexa/">post anterior</a>:</p>
<pre>
private static String stringHexa(byte[] bytes) {
   StringBuilder s = new StringBuilder();
   for (int i = 0; i &lt; bytes.length; i++) {
       int parteAlta = ((bytes[i] &gt;&gt; 4) &amp; 0xf) &lt;&lt; 4;
       int parteBaixa = bytes[i] &amp; 0xf;
       if (parteAlta == 0) s.append('0');
       s.append(Integer.toHexString(parteAlta | parteBaixa));
   }
   return s.toString();
}
</pre>
<p>Além do MD5, podemos também usar outros algoritmos de hash normalmente presentes nas distribuições da JVM. O exemplo a seguir gera os códigos MD5, SHA-1 e SHA-256 da mesma mensagem:</p>
<pre>
public static byte[] gerarHash(String frase, String algoritmo) {
  try {
    MessageDigest md = MessageDigest.getInstance(algoritmo);
    md.update(frase.getBytes());
    return md.digest();
  } catch (NoSuchAlgorithmException e) {
    return null;
  }
}
</pre>
<pre>
public static void main(String[] args) {
  String frase = "Quero gerar códigos hash desta mensagem.";
  System.out.println(stringHexa(gerarHash(frase, "MD5")));
  System.out.println(stringHexa(gerarHash(frase, "SHA-1")));
  System.out.println(stringHexa(gerarHash(frase, "SHA-256")));
}
</pre>
<p>A saída deste programa será:</p>
<pre>
51408e7592917e916b55f8021a0f7ad3
5907736c4de6fdd70fcdc7517c3aebd257a1addc
ed40c896d779f946956483d45e9efe08aac6373935d354c2be2136bf05bca42c
</pre>
]]></content:encoded>
			<wfw:commentRss>http://codare.net/2007/02/02/java-gerando-codigos-hash-md5-sha/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>Java: Percorrendo coleções com Java 5</title>
		<link>http://codare.net/2007/01/22/java-percorrendo-colecoes-com-java-5/</link>
		<comments>http://codare.net/2007/01/22/java-percorrendo-colecoes-com-java-5/#comments</comments>
		<pubDate>Mon, 22 Jan 2007 14:28:53 +0000</pubDate>
		<dc:creator>João Del Valle</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://codare.net/2007/01/22/percorrendo-colecoes-com-java-5/</guid>
		<description><![CDATA[Palavras-chave: Java, Java 5, coleções, iteração, genéricos A linguagem Java já tem mais de uma década de idade e naturalmente evoluiu neste período. Verifique se o jeito que você usa coleções está atualizado. Antes do Java 1.2, a classe para &#8230; <a href="http://codare.net/2007/01/22/java-percorrendo-colecoes-com-java-5/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Palavras-chave: Java, Java 5, coleções, iteração, genéricos</p>
<p>A linguagem Java já tem mais de uma década de idade e naturalmente evoluiu neste período. Verifique se o jeito que você usa coleções está atualizado.</p>
<p>Antes do Java 1.2, a classe para representar arrays dinâmicos era a java.util.Vector:</p>
<pre>
Vector ps = new Vector();
ps.addElement(new Pessoa("Maria 1.1"));
for (Enumeration e = ps.elements(); e.hasMoreElements();)
  System.out.println(((Pessoa) e.nextElement()).getNome());
</pre>
<p>O Java 1.2 trouxe as classes ArrayList, LinkedList, HashMap, HashSet, que, em conjunto com outras, formaram o Collections Framework, uma biblioteca padronizada e bastante completa para lidar com coleções de valores. Algumas das novidades:</p>
<ul>
<li>
<p>Os nomes de métodos ficaram mais curtos.</p>
</li>
<li>
<p>A hierarquia de classes e interfaces está mais bem formada e útil. Por exemplo, LinkedList e ArrayList podem ser generalizadas como List.</p>
</li>
<li>
<p>Foram feitas algumas otimizações de performance. Por exemplo, ArrayList não tem todos os métodos synchronized, como Vector.
</li>
</ul>
<p>Exemplificando:</p>
<pre>
List ps = new ArrayList();
ps.add(new Pessoa("Maria 1.2"));
for (Iterator i = ps.iterator(); i.hasNext();)
  System.out.println(((Pessoa) i.next()).getNome());
</pre>
<p>No Java 1.5 (ou Java 5), além das evoluções normais da API, houve também algumas mudanças na própria linguagem:</p>
<pre>
List&lt;Pessoa&gt; ps = new ArrayList&lt;Pessoa&gt;();
ps.add(new Pessoa("Maria 1.5"));
for (Pessoa p : ps)
  System.out.println(p.getNome());
</pre>
<p>Como se vê, as coleções podem agora usar tipos genéricos e há uma nova estrutura de for, chamada for-each.</p>
<p>Portanto, se de vez em quando você ainda se encontra usando Vector, procure atualizar-se para poder evoluir junto com a linguagem daqui para frente.</p>
]]></content:encoded>
			<wfw:commentRss>http://codare.net/2007/01/22/java-percorrendo-colecoes-com-java-5/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

