Java hidden features
-
Upload
josenaldo-de-oliveira-matos-filho -
Category
Documents
-
view
748 -
download
6
Transcript of Java hidden features
![Page 1: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/1.jpg)
Java Hidden Features
Traquitanas escondidas ou simplesmente pouco usadas no Java
![Page 2: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/2.jpg)
São “features” pouco usadas do Java◦ Nenhuma feature é escondida, apenas obscura,
desconhecida◦ Algumas delas são bem esquisitas◦ Muitas consideradas até mesmo impossíveis
Use com cautela◦ Em alguns casos, são facilidades◦ Porém, em outros, deixam as coisas mais
complicadas. Podem piorar, por exemplo, a legibilidade
O que são Hidden Features
![Page 3: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/3.jpg)
Uma das formas mais estranhas de se criar um Map inicializado é através da Double Brace Initialization.
Ex:
Double Brace Initialization
Map map = new HashMap() {{ put("a key", "a value"); put("another key", "another value"); }};
Veja mais: http://www.c2.com/cgi/wiki?DoubleBraceInitialization
![Page 4: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/4.jpg)
WTF?◦ Classes internas anônimas que herda de HashMap
Portanto, herda métodos como put()◦ Bloco de inicialização
Chamado logo após a chamada a super() Em um construtor sem o “super”, passa a impressão
de eu é chamado antes do construtor Pode ser usado para agrupar lógica usada por vários
construtores É legal, mas evite!
Double Brace Initialization
![Page 5: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/5.jpg)
Uma adição do Java 1.5 ainda pouco conhecida (ou percebida) Um método sobrescrito pode retornar uma subclasse da classe
retornada pelo método da superclasse (ou interface) Necessário para o funcionamento de generics
Covariant Return
class Super { Collection<String> values() { ... }}
class SubClass extends Super { @Override List<String> values() { ... }}
![Page 6: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/6.jpg)
Quer lançar uma NullPointerException?
Lançando NullPointerExcenption
public void mandaNullNaCara() {throw null;
}
Como assim? O compilador pirou? Tá cobrando
propina pra deixar isso passar?
![Page 7: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/7.jpg)
A instrução throw, ao ser processada, avalia a expressão à direita. ◦ Se a expressão gera um Throwable, este é lançado
Ex: throw getException()◦ Se a expressão completa normalmente,
produzindo um valor não nulo, retorna esse valor Ex: throw new SograEmCasaException()
◦ Se a expressão resulta em null, o null é convertido para NullpointerException!
Lançando NullPointerExcenption
Veja mais:http://www.adarshr.com/papers/npehttp://java.sun.com/docs/books/jls/
![Page 8: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/8.jpg)
Quer tirar uma exceção lançada de campo?◦ Faz o return no finally!
O código abaixo não lança a exceção
Brincando com finally
public static void fazAlgumaCoisa() { try { //Faz alguma coisa… throw new RuntimeException(); } finally { return; } }
![Page 9: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/9.jpg)
Quem for pego fazendo isso vai sofrer vudu reverso!◦ Um erro é para ser
tratado ou lançado, nunca escondido!
Atenção
Veja Mais: http://jamesjava.blogspot.com/2006/03/dont-return-in-
finally-clause.html
![Page 10: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/10.jpg)
Como lançar uma exceção CHECADA de um método que não declara exceção!
Agora mais bizarro ainda!
import java.rmi.RemoteException;
class Thrower { public static void spit(final Throwable exception) { class EvilThrower<T extends Throwable> { @SuppressWarnings("unchecked") private void sneakyThrow(Throwable exception)
throws T { throw (T) exception; } }
new EvilThrower<RuntimeException>().sneakyThrow(exception); }}
![Page 11: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/11.jpg)
Agora mais bizarro ainda!public class ThrowerSample { public static void main( String[] args ) { Thrower.spit(new RemoteException("go unchecked!")); }}
Mim não gostar de lançar
exceção assim!
![Page 12: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/12.jpg)
Java não tem goto, mas...
Labeled Blocks
// codigo
saifora:{ for (int i = 0; i < N; ++i) { for (int j = i; j < N; ++j) { for (int k = j; k < N; ++k) { //mais código pog break saifora; } } }}
Quero ver isso funcionar!
![Page 13: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/13.jpg)
Labeled Blockspublic static String getErrorMsg(String _data){ String _errMsg = “”; VALIDATION: { if (_data.length() > 10) { _errMsg = “ERR: Data length exceed 10 chars”; break VALIDATION; } // Resto docódigo de validação } // Tratamento da mensagem de erro if (_errMsg.length() != 0) { _errMsg += “\nPlease fix the error.”; } return _errMsg;}
Problem?
![Page 14: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/14.jpg)
Muita gente não sabe, mas enums podem:◦ Ter Métodos◦ Ter Atributos◦ Ter Construtores◦ Implementar interfaces
Enum
Veja mais:http://java.sun.com/j2se/1.5.0/docs/guide/language/enums.html
![Page 15: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/15.jpg)
Enum
enum Caes{ MINOTAURO(2), TITAN(3), SADAM(7);
private int idade; Caes(int idade) { this.idade = idade; } public int getIdade() { return idade; }}
![Page 16: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/16.jpg)
Enumpublic enum Salas implements Sala{ PRIMEIRA{ public Sala norte() { return SEGUNDA; } }, SEGUNDA{ public Sala sul() { return PRIMEIRA; } }
public Sala norte() { return null; } public Sala sul() { return null; } public Sala lest() { return null; } public Sala oeste() { return null; }}
public interface Sala{ public Sala norte(); public Sala sul(); public Sala leste(); public Sala oeste();}
![Page 17: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/17.jpg)
Desde a versão 1.5, o Java aceita parâmetros variáveis
Var args
public void foo(String... bars) { for (String bar: bars) System.out.println(bar);}
public void test() {
foo("first","second","third")}
![Page 18: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/18.jpg)
Printf e String.format Printf do entrou na versão 1.5
String.format funciona analogamente, mas retorna ao invés de imprimir
double x = 27.5;double y = 33.75;System.out.printf("x = %f y = %g", x, y);
double x = 27.5;double y = 33.75;String s = String.format("x = %f y = %g", x, y);System.out.println(“String.format = “ + s);
![Page 19: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/19.jpg)
Divisão por 0public class teste { public static void main(String[] args) { try{ int x = 15; int z = 0; double y = x / z; System.out.println(“A divisão é “ + y); }catch(ArithmeticException a){ System.out.println(“Erro!! Divisão por zero!!!”); } }}
Ok. Isto lança uma ArithmeticExceptio
n
![Page 20: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/20.jpg)
Divisão por 0public class teste { public static void main(String[] args) { try{ double x = 15;
double z = 0; double y = x / z; System.out.println(“A divisão é “ + x); }catch(ArithmeticException a){ System.out.println(“Erro!! Divisão por zero!!!”); } }}
WTF???????
![Page 21: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/21.jpg)
Quer ver um dump da hierarquia de componentes numa aplicação Swing?◦ Ctrl + Shift + F1◦ Resultado no console◦ Boa ferramenta para depuração!
Swing
![Page 22: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/22.jpg)
Qual o resultado disso?
E isso?
Brincando com URLs
new URL("http://www.guj.com.br").equals(new URL("http://208.109.100.149") )
public int umMetodo(){ System.out.println(“Acessando o Google:”); http://www.google.com return 1;}
![Page 23: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/23.jpg)
Como acessar os métodos e campos privados de fora dessa classe?
Arrebentando o encapsulamento
public class Foo { private int bar; public Foo() { setBar(17); } private void setBar(int bar) { this.bar=bar; } public int getBar() { return bar; } public String toString() { return "Foo[bar="+bar+"]"; }}
![Page 24: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/24.jpg)
Arrebentando o encapsulamentoimport java.lang.reflect.*;
public class Arrebenta { public static void main(String[] args) throws NoSuchMethodException,IllegalAccessException, InvocationTargetException, NoSuchFieldException { Foo foo=new Foo(); System.out.println(foo); Method method=Foo.class.getDeclaredMethod ("setBar", int.class); method.setAccessible(true); method.invoke(foo, 42);
![Page 25: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/25.jpg)
Arrebentando o encapsulamento System.out.println(foo); Field field=Foo.class.getDeclaredField("bar"); field.setAccessible(true); field.set(foo, 23); System.out.println(foo); }}
Isso vai dar merda!
![Page 26: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/26.jpg)
Acesso esquisitopublic class Foo { static int fubar = 42;
Foo getFoo() { return null; }
public static void main(String args[]) { Foo foo = new Foo(); System.out.println(foo.getFoo().fubar); }}// saida: 42
Agora você tá de
sacanagem!
![Page 27: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/27.jpg)
É possível criar um programa sem Main!
Classe sem main!
public class WithoutMain { static { System.out.println("Look man, no main!!"); System.exit(0); }}
$ java WithoutMainLook man, no main!!
![Page 28: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/28.jpg)
Distribuída com o JDK a partir da versão1.6_07 Profiler leve Integra uma série de ferramentas de linha de
comando
VisualVM
Veja mais:http://visualvm.java.net/
![Page 29: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/29.jpg)
Todo arquivo .class começa com o valor hexadecimal 0xCAFEBABE, para identificá-lo como um arquivo de Bytecode válido.
Quer exibir uma Splash screen?◦ Basta rodar o programa com o parâmetro de
máriona virtual splash:caminho
Curiosidades
java -splash:imagem.jpeg -jar Reverso.jar
![Page 30: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/30.jpg)
Classes anônimas Você pode definir uma classe anônima e
imediatamente chamar um método, mesmo que ela não implemente nenhuma interface
new Object() { void foo(String s) { System.out.println(s); }}.foo("Hello");
![Page 31: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/31.jpg)
Permite a criação de uma thread eu será chamada somente quando a JVM for encerrada◦ Global JVM Finalizer◦ Liberar recursos◦ Matar programas
Funciona com System.exit(), ou com CTRL-C / kill -15◦ Obviamente, não funciona com kill -9, em *nix
Shutdown Hooks
![Page 32: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/32.jpg)
Shutdown Hooks
Runtime.getRuntime().addShutdownHook( new Thread() { public void run() { endApp(); }});;
![Page 33: Java hidden features](https://reader034.fdocumentos.tips/reader034/viewer/2022042510/5572c859d8b42abb378b4bd2/html5/thumbnails/33.jpg)
Perguntas