Além de ignorantes, apáticos e egoístas, bons objetos são tímidos.
É o que dizem os Programadores Pragmáticos (Andy Hunt e Dave Thomas), no artigo de 2003 The Art of Enbugging:
Além de ignorantes, apáticos e egoístas, bons objetos são tímidos.
É o que dizem os Programadores Pragmáticos (Andy Hunt e Dave Thomas), no artigo de 2003 The Art of Enbugging:
Digamos que você tem um código que, por reflexão, usa a classe Resolucao12 para chamar o método designacao:
package br.gov.anvisa;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) throws Exception {
Class classe = Class.forName("br.gov.anvisa.resolucoes.Resolucao12");
Object objeto = classe.newInstance();
Method metodo = classe.getMethod("designacao");
System.out.println(metodo.invoke(objeto));
}
}
Não há dependência em compile time a essa classe Resolucao12. Precisamos dela apenas em runtime.
Você resolveu usar Java 9 no seu projeto e criou um módulo:
module br.com.alexandreaquiles.projeto {
}
Por padrão, todo módulo “puxa” o java.base, que disponibiliza pacotes como java.lang, java.math, java.util e java.io.
Vamos dizer que seu código usa o JDBC. Pra poder ter acesso a interfaces como Connection e PreparedStatement, você precisa dizer que usa o módulo java.sql:
module br.com.alexandreaquiles.projeto {
requires java.sql;
}
Agora, digamos que o seu projeto usa a biblioteca commonmark, responsável por renderizar arquivos Markdown.
Os desenvolvedores dessa biblioteca não criaram um module-info.java. Ou seja, o JAR do commonmark não está modularizado.
O que preciso colocar no requires pra usar classes dessa biblioteca no meu código?
– Lembra daquela história de módulo sem nome do Java 9?
– O módulo criado automaticamente pelo Java 9 ao executar um JAR não modularizado?
– Isso. Um “módulo sem nome” depende do módulo java.se, que tem como dependências os módulos java.logging, java.sql, java.rmi e mais uma penca, né?
– Mas não puxa o módulo java.se.ee, que teria o JAXB no módulo javax.xml.bind e o JAX-WS no java.xml.ws e mais alguns…
– Exato. Conversamos sobre isso daquela outra vez quando deu o NoClassDefFoundError de JAXBException, né?
– Isso mesmo!
– O que você acha que aconteceria com esse código?
import javafx.application.Application;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.ButtonType;
import javafx.stage.Stage;
public class OlaMundo extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) throws Exception {
Alert alerta = new Alert(AlertType.INFORMATION, "Funcionou?", ButtonType.OK);
alerta.setHeaderText("Janelinha do JavaFX");
alerta.setResizable(true);
alerta.showAndWait();
}
}
– Usa o JavaFX, né? Tem declaração de módulo?