SlideShare uma empresa Scribd logo
Java HiddenFeaturesTraquitanas  escondidas ou simplesmente pouco usadas no Java
Josenaldo de Oliveira Matos FilhoAnalista de Sistema Everis8 anos de experiência com Java e desenvolvimentoUaiJUGLeaderApaixonado por programação e desenvolvimento de softwarehttp://jnaldo.comQuem sou eu?
São “features” pouco usadas do JavaNenhuma feature é escondida, apenas obscura, desconhecidaAlgumas delas são bem esquisitasMuitas consideradas até mesmo impossíveisUse com cautelaEm alguns casos, são facilidadesPorém, em outros, deixam as coisas mais complicadas.Podem piorar, por exemplo, a legibilidadeO que são HiddenFeatures
Uma das formas mais estranhas de se criar um Map inicializado é através da Double BraceInitialization.Ex: Double BraceInitializationMapmap = newHashMap() {{  put("a key", "a value");  put("anotherkey", "anothervalue");  }}; Veja mais: 	http://www.c2.com/cgi/wiki?DoubleBraceInitialization
WTF?Classes internas anônimas que herda de HashMapPortanto, herda métodos como put()Bloco de inicializaçãoChamado logo após a chamada a super()Em um construtor sem o “super”, passa a impressão de eu é chamado antes do construtorPode ser usado para agrupar lógica usada por vários construtoresÉ legal, mas evite!Double BraceInitialization
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 genericsCovariantReturnclass Super {Collection<String> values() {        ...    }}classSubClassextends Super {    @OverrideList<String> values() {        ...    }}
Quer lançar uma NullPointerException?Lançando NullPointerExcenptionpublicvoidmandaNullNaCara() {thrownull;}Como assim? O compilador pirou? Tá cobrando propina pra deixar isso passar?
A instrução throw, ao ser processada, avalia a expressão à direita. Se a expressão gera um Throwable, este é lançadoEx: throwgetException()Se a expressão completa normalmente, produzindo um valor não nulo, retorna esse valorEx: thrownewSograEmCasaException()Se a expressão resulta em null, o null é convertido para NullpointerException!Lançando NullPointerExcenptionVeja mais:	http://www.adarshr.com/papers/npe	http://java.sun.com/docs/books/jls/
Quer tirar uma exceção lançada de campo?Faz o return no finally!O código abaixo não lança a exceçãoBrincando com finallypublic static void fazAlgumaCoisa() {    try {      //Fazalgumacoisa…      throw new RuntimeException();    } finally {      return;    }  }
Quem for pego fazendo isso vai sofrer vudu reverso!Um erro é para ser tratado ou lançado, nunca escondido!AtençãoVeja Mais: 	http://jamesjava.blogspot.com/2006/03/dont-return-in-finally-clause.html
Como lançar uma exceção CHECADA de um método que não declara exceção!Agora mais bizarro ainda!importjava.rmi.RemoteException;classThrower {publicstaticvoidspit(final Throwable exception) {classEvilThrower<T extendsThrowable> {      @SuppressWarnings("unchecked")privatevoidsneakyThrow(Throwable exception) throws T {throw (T) exception;      }    }newEvilThrower<RuntimeException>().sneakyThrow(exception);  }}
Agora mais bizarro ainda!publicclassThrowerSample {publicstaticvoidmain( String[] args ) {Thrower.spit(newRemoteException("gounchecked!"));    }}Mim não gostar de lançar exceção assim!
Java não tem goto, mas...LabeledBlocksQuero ver isso funcionar!// codigosaifora:{    for (int i = 0; i < N; ++i) {        for (int j = i; j < N; ++j) {            for (int k = j; k < N; ++k) {                //mais código pogbreaksaifora;            }        }    }}
LabeledBlockspublicstatic String getErrorMsg(String _data){    String _errMsg = “”;     VALIDATION:    {        if (_data.length() > 10)        {            _errMsg = “ERR: Data lengthexceed 10 chars”;            break VALIDATION;        }         // Resto docódigo de validação    }     // Tratamento da mensagem de erro    if (_errMsg.length() != 0)    {        _errMsg += “\nPleasefixtheerror.”;     }     return _errMsg;} Problem?
Muita gente não sabe, mas enums podem:Ter MétodosTer AtributosTer ConstrutoresImplementar interfacesEnumVeja mais:	http://java.sun.com/j2se/1.5.0/docs/guide/language/enums.html
EnumenumCaes{  MINOTAURO(2), TITAN(3), SADAM(7);privateint idade;Caes(int idade) {this.idade = idade;  }publicintgetIdade() {return idade;  }}
Enumpublicenum Salas implements Sala{   PRIMEIRA{public Sala norte() {return SEGUNDA;      }   },   SEGUNDA{public Sala sul() {return PRIMEIRA;      }   }public Sala norte() { returnnull; }public Sala sul() { returnnull; }public Sala lest() { returnnull; }public Sala oeste() { returnnull; }}public interface Sala{public Sala norte();public Sala sul();public Sala leste();public Sala oeste();}
Desde a versão 1.5, o Java aceita parâmetros variáveisVar argspublicvoidfoo(String... bars) {   for (String bar: bars)      System.out.println(bar);}publicvoidtest() {foo("first","second","third")}
Printf e String.formatPrintf do entrou na versão 1.5String.format funciona analogamente, mas retorna ao invés de imprimirdouble 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);
Divisão por 0publicclass teste {publicstaticvoidmain(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 ArithmeticException
Divisão por 0publicclass teste {publicstaticvoidmain(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???????
Quer ver um dump da hierarquia de componentes numa aplicação Swing?Ctrl + Shift + F1Resultado no consoleBoa ferramenta para depuração! Swing
Qual o resultado disso?E isso?Brincando com URLsnew URL("http://www.guj.com.br").equals(new URL("http://208.109.100.149") )public intumMetodo(){System.out.println(“Acessando o Google:”);    http://www.google.com    return 1;}
Como acessar os métodos e campos privados de fora dessa classe?Arrebentando o encapsulamentopublicclassFoo {privateint bar;publicFoo() {setBar(17);  }privatevoidsetBar(int bar) {this.bar=bar;  }publicintgetBar() {return bar;  }public String toString() {return "Foo[bar="+bar+"]";  }}
Arrebentando o encapsulamentoimportjava.lang.reflect.*;publicclass Arrebenta {publicstaticvoidmain(String[] args)throwsNoSuchMethodException,IllegalAccessException,  InvocationTargetException, NoSuchFieldException {Foofoo=newFoo();      System.out.println(foo);Methodmethod=Foo.class.getDeclaredMethod        ("setBar", int.class);method.setAccessible(true);method.invoke(foo, 42);
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!
Acesso esquisitopublicclassFoo {staticintfubar = 42;FoogetFoo() {returnnull;        }publicstaticvoidmain(String args[]) {Foofoo = newFoo();        System.out.println(foo.getFoo().fubar);    }}// saida:  42Agora você tá de sacanagem!
É possível criar um programa sem Main!Classe sem main!publicclassWithoutMain {static {        System.out.println("Lookman, no main!!");        System.exit(0);    }}$ javaWithoutMainLookman, no main!!
Distribuída com o JDK  a partir da versão1.6_07Profiler leveIntegra uma série de ferramentas de linha de comandoVisualVMVeja mais:	http://visualvm.java.net/
Todo arquivo .class começa com o valor hexadecimal 0xCAFEBABE, paraidentificá-lo como um arquivo de Bytecodeválido.Querexibiruma Splash screen?Bastarodar o programa com o parâmetro de máriona virtual splash:caminhoCuriosidadesjava -splash:imagem.jpeg -jar Reverso.jar
Classes anônimasVocê pode definir uma classe anônima e imediatamente chamar um método, mesmo que ela não implemente nenhuma interfacenewObject() {voidfoo(String s) {    System.out.println(s);  }}.foo("Hello");
Permite a criação de uma thread eu será chamada somente quando a JVM for encerradaGlobal JVM FinalizerLiberar recursosMatar programasFunciona com System.exit(), ou com CTRL-C / kill -15Obviamente, nãofunciona com kill -9, em *nixShutdown Hooks
Shutdown HooksRuntime.getRuntime().addShutdownHook(new Thread() {publicvoidrun() {endApp();    }});;
Perguntas

Mais conteúdo relacionado

PPTX
Java hidden features
PPTX
Programação Concorrente - Aula 04
PPT
Excecoes
PDF
[Curso Java Basico] Aula 60: Escopo de Variaveis
PDF
[Curso Java Basico - Exceptions] Aula 50: stacktrace e throws
PDF
[Curso Java Basico - Exceptions] Aula 49: finally
PDF
[Curso Java Basico - Exceptions] Aula 47: try, catch
PPTX
Programação Orientada por Objectos - Aula 5
Java hidden features
Programação Concorrente - Aula 04
Excecoes
[Curso Java Basico] Aula 60: Escopo de Variaveis
[Curso Java Basico - Exceptions] Aula 50: stacktrace e throws
[Curso Java Basico - Exceptions] Aula 49: finally
[Curso Java Basico - Exceptions] Aula 47: try, catch
Programação Orientada por Objectos - Aula 5

Mais procurados (20)

PPTX
Programação Concorrente - Aula 05
PDF
Erros, exceções e asserções
PDF
[Curso Java Basico - Exceptions] Aula 52: criando sua propria exception
ODP
Java 13 Excecoes
PPT
Tratamento de exceções java
ODP
Código Limpo
PPTX
Threads e Estruturas de dados
PDF
UnP Eng. Software - Aula 28
PDF
[Curso Java Basico - Exceptions] Aula 48: multiplos catch
PPTX
Tratamento de exceções em Java
PDF
Introdução a programação I
PDF
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
PDF
[MTC 2021] Conversa sobre shift left - Douglas Cardoso
PDF
JavaScript das Ruas
PDF
Programação Desktop: Revisão Core Java
PDF
Programando Melhor - Flisol
PPTX
Javascript
PDF
Desligar pc
PDF
POO - 22 - Tratamento de Exceções em Java
Programação Concorrente - Aula 05
Erros, exceções e asserções
[Curso Java Basico - Exceptions] Aula 52: criando sua propria exception
Java 13 Excecoes
Tratamento de exceções java
Código Limpo
Threads e Estruturas de dados
UnP Eng. Software - Aula 28
[Curso Java Basico - Exceptions] Aula 48: multiplos catch
Tratamento de exceções em Java
Introdução a programação I
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
[MTC 2021] Conversa sobre shift left - Douglas Cardoso
JavaScript das Ruas
Programação Desktop: Revisão Core Java
Programando Melhor - Flisol
Javascript
Desligar pc
POO - 22 - Tratamento de Exceções em Java
Anúncio

Semelhante a Java hidden features (20)

PPT
Linguagens de Programação II - Aula 3
PDF
Java script aula 02 - operadores
PDF
Java aprendendo linguagem.ppt
PDF
Tutorial java swing
PDF
Estrutura de linguagem C++
ODP
Ganhando tempo com casos de testes
PPT
Aula3
PPT
Tdc2010 web
DOCX
Java para iniciantes
PDF
Programação funcional em JavaScript: como e por quê?
PDF
Artigoajax
PDF
Java introdução ao java
PDF
JS Experience 2017 - Javascript Funcional
PPT
Aula5
PPT
Aop Aspect J 1.5.4 Capitulo 04
PPTX
Java e orientação a objetos
ODP
Palestra Mocks - AgileBrazil 2010
ODP
Groovy para javeiros - Migração Painless
PPTX
ESTRUTURA DE DADOS (JAVA) AULA 09
Linguagens de Programação II - Aula 3
Java script aula 02 - operadores
Java aprendendo linguagem.ppt
Tutorial java swing
Estrutura de linguagem C++
Ganhando tempo com casos de testes
Aula3
Tdc2010 web
Java para iniciantes
Programação funcional em JavaScript: como e por quê?
Artigoajax
Java introdução ao java
JS Experience 2017 - Javascript Funcional
Aula5
Aop Aspect J 1.5.4 Capitulo 04
Java e orientação a objetos
Palestra Mocks - AgileBrazil 2010
Groovy para javeiros - Migração Painless
ESTRUTURA DE DADOS (JAVA) AULA 09
Anúncio

Mais de Josenaldo de Oliveira Matos Filho (7)

PPTX
De Padawan a Jedi - A Saga do Desenvolvedor Java
PPTX
Coding Dojo em 10 Minutos!
PPTX
O Spring está morto! Viva o Spring!
PDF
Programação Orientada a Gambiarra
PPTX
Java virtual machine quantas linguas fala a jvm2
PPT
Josenaldo a jornada do empreendedor - a aventura da JNaldo
PPTX
A saga do desenvolvedor java
De Padawan a Jedi - A Saga do Desenvolvedor Java
Coding Dojo em 10 Minutos!
O Spring está morto! Viva o Spring!
Programação Orientada a Gambiarra
Java virtual machine quantas linguas fala a jvm2
Josenaldo a jornada do empreendedor - a aventura da JNaldo
A saga do desenvolvedor java

Último (19)

PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PDF
Apple Pippin Uma breve introdução. - David Glotz
PPTX
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
PDF
COBITxITIL-Entenda as diferença em uso governança TI
PDF
Processos na gestão de transportes, TM100 Col18
PDF
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
PPTX
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
PDF
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
PPTX
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
PDF
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
PPTX
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PDF
Custos e liquidação no SAP Transportation Management, TM130 Col18
PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
PDF
Aula04-Academia Heri- Tecnologia Geral 2025
PPTX
Aula 18 - Manipulacao De Arquivos python
PDF
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
Apple Pippin Uma breve introdução. - David Glotz
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
COBITxITIL-Entenda as diferença em uso governança TI
Processos na gestão de transportes, TM100 Col18
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Custos e liquidação no SAP Transportation Management, TM130 Col18
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
Aula04-Academia Heri- Tecnologia Geral 2025
Aula 18 - Manipulacao De Arquivos python
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14

Java hidden features

  • 1. Java HiddenFeaturesTraquitanas escondidas ou simplesmente pouco usadas no Java
  • 2. Josenaldo de Oliveira Matos FilhoAnalista de Sistema Everis8 anos de experiência com Java e desenvolvimentoUaiJUGLeaderApaixonado por programação e desenvolvimento de softwarehttp://jnaldo.comQuem sou eu?
  • 3. São “features” pouco usadas do JavaNenhuma feature é escondida, apenas obscura, desconhecidaAlgumas delas são bem esquisitasMuitas consideradas até mesmo impossíveisUse com cautelaEm alguns casos, são facilidadesPorém, em outros, deixam as coisas mais complicadas.Podem piorar, por exemplo, a legibilidadeO que são HiddenFeatures
  • 4. Uma das formas mais estranhas de se criar um Map inicializado é através da Double BraceInitialization.Ex: Double BraceInitializationMapmap = newHashMap() {{ put("a key", "a value"); put("anotherkey", "anothervalue"); }}; Veja mais: http://www.c2.com/cgi/wiki?DoubleBraceInitialization
  • 5. WTF?Classes internas anônimas que herda de HashMapPortanto, herda métodos como put()Bloco de inicializaçãoChamado logo após a chamada a super()Em um construtor sem o “super”, passa a impressão de eu é chamado antes do construtorPode ser usado para agrupar lógica usada por vários construtoresÉ legal, mas evite!Double BraceInitialization
  • 6. 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 genericsCovariantReturnclass Super {Collection<String> values() { ... }}classSubClassextends Super { @OverrideList<String> values() { ... }}
  • 7. Quer lançar uma NullPointerException?Lançando NullPointerExcenptionpublicvoidmandaNullNaCara() {thrownull;}Como assim? O compilador pirou? Tá cobrando propina pra deixar isso passar?
  • 8. A instrução throw, ao ser processada, avalia a expressão à direita. Se a expressão gera um Throwable, este é lançadoEx: throwgetException()Se a expressão completa normalmente, produzindo um valor não nulo, retorna esse valorEx: thrownewSograEmCasaException()Se a expressão resulta em null, o null é convertido para NullpointerException!Lançando NullPointerExcenptionVeja mais: http://www.adarshr.com/papers/npe http://java.sun.com/docs/books/jls/
  • 9. Quer tirar uma exceção lançada de campo?Faz o return no finally!O código abaixo não lança a exceçãoBrincando com finallypublic static void fazAlgumaCoisa() { try { //Fazalgumacoisa… throw new RuntimeException(); } finally { return; } }
  • 10. Quem for pego fazendo isso vai sofrer vudu reverso!Um erro é para ser tratado ou lançado, nunca escondido!AtençãoVeja Mais: http://jamesjava.blogspot.com/2006/03/dont-return-in-finally-clause.html
  • 11. Como lançar uma exceção CHECADA de um método que não declara exceção!Agora mais bizarro ainda!importjava.rmi.RemoteException;classThrower {publicstaticvoidspit(final Throwable exception) {classEvilThrower<T extendsThrowable> { @SuppressWarnings("unchecked")privatevoidsneakyThrow(Throwable exception) throws T {throw (T) exception; } }newEvilThrower<RuntimeException>().sneakyThrow(exception); }}
  • 12. Agora mais bizarro ainda!publicclassThrowerSample {publicstaticvoidmain( String[] args ) {Thrower.spit(newRemoteException("gounchecked!")); }}Mim não gostar de lançar exceção assim!
  • 13. Java não tem goto, mas...LabeledBlocksQuero ver isso funcionar!// codigosaifora:{ for (int i = 0; i < N; ++i) { for (int j = i; j < N; ++j) { for (int k = j; k < N; ++k) { //mais código pogbreaksaifora; } } }}
  • 14. LabeledBlockspublicstatic String getErrorMsg(String _data){    String _errMsg = “”;     VALIDATION:    {        if (_data.length() > 10)        {            _errMsg = “ERR: Data lengthexceed 10 chars”;            break VALIDATION;        }         // Resto docódigo de validação    }     // Tratamento da mensagem de erro    if (_errMsg.length() != 0)    {        _errMsg += “\nPleasefixtheerror.”;     }     return _errMsg;} Problem?
  • 15. Muita gente não sabe, mas enums podem:Ter MétodosTer AtributosTer ConstrutoresImplementar interfacesEnumVeja mais: http://java.sun.com/j2se/1.5.0/docs/guide/language/enums.html
  • 16. EnumenumCaes{ MINOTAURO(2), TITAN(3), SADAM(7);privateint idade;Caes(int idade) {this.idade = idade; }publicintgetIdade() {return idade; }}
  • 17. Enumpublicenum Salas implements Sala{ PRIMEIRA{public Sala norte() {return SEGUNDA; } }, SEGUNDA{public Sala sul() {return PRIMEIRA; } }public Sala norte() { returnnull; }public Sala sul() { returnnull; }public Sala lest() { returnnull; }public Sala oeste() { returnnull; }}public interface Sala{public Sala norte();public Sala sul();public Sala leste();public Sala oeste();}
  • 18. Desde a versão 1.5, o Java aceita parâmetros variáveisVar argspublicvoidfoo(String... bars) { for (String bar: bars) System.out.println(bar);}publicvoidtest() {foo("first","second","third")}
  • 19. Printf e String.formatPrintf do entrou na versão 1.5String.format funciona analogamente, mas retorna ao invés de imprimirdouble 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);
  • 20. Divisão por 0publicclass teste {publicstaticvoidmain(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 ArithmeticException
  • 21. Divisão por 0publicclass teste {publicstaticvoidmain(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???????
  • 22. Quer ver um dump da hierarquia de componentes numa aplicação Swing?Ctrl + Shift + F1Resultado no consoleBoa ferramenta para depuração! Swing
  • 23. Qual o resultado disso?E isso?Brincando com URLsnew URL("http://www.guj.com.br").equals(new URL("http://208.109.100.149") )public intumMetodo(){System.out.println(“Acessando o Google:”); http://www.google.com return 1;}
  • 24. Como acessar os métodos e campos privados de fora dessa classe?Arrebentando o encapsulamentopublicclassFoo {privateint bar;publicFoo() {setBar(17); }privatevoidsetBar(int bar) {this.bar=bar; }publicintgetBar() {return bar; }public String toString() {return "Foo[bar="+bar+"]"; }}
  • 25. Arrebentando o encapsulamentoimportjava.lang.reflect.*;publicclass Arrebenta {publicstaticvoidmain(String[] args)throwsNoSuchMethodException,IllegalAccessException, InvocationTargetException, NoSuchFieldException {Foofoo=newFoo(); System.out.println(foo);Methodmethod=Foo.class.getDeclaredMethod ("setBar", int.class);method.setAccessible(true);method.invoke(foo, 42);
  • 26. 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!
  • 27. Acesso esquisitopublicclassFoo {staticintfubar = 42;FoogetFoo() {returnnull; }publicstaticvoidmain(String args[]) {Foofoo = newFoo(); System.out.println(foo.getFoo().fubar); }}// saida: 42Agora você tá de sacanagem!
  • 28. É possível criar um programa sem Main!Classe sem main!publicclassWithoutMain {static { System.out.println("Lookman, no main!!"); System.exit(0); }}$ javaWithoutMainLookman, no main!!
  • 29. Distribuída com o JDK a partir da versão1.6_07Profiler leveIntegra uma série de ferramentas de linha de comandoVisualVMVeja mais: http://visualvm.java.net/
  • 30. Todo arquivo .class começa com o valor hexadecimal 0xCAFEBABE, paraidentificá-lo como um arquivo de Bytecodeválido.Querexibiruma Splash screen?Bastarodar o programa com o parâmetro de máriona virtual splash:caminhoCuriosidadesjava -splash:imagem.jpeg -jar Reverso.jar
  • 31. Classes anônimasVocê pode definir uma classe anônima e imediatamente chamar um método, mesmo que ela não implemente nenhuma interfacenewObject() {voidfoo(String s) { System.out.println(s); }}.foo("Hello");
  • 32. Permite a criação de uma thread eu será chamada somente quando a JVM for encerradaGlobal JVM FinalizerLiberar recursosMatar programasFunciona com System.exit(), ou com CTRL-C / kill -15Obviamente, nãofunciona com kill -9, em *nixShutdown Hooks