Algumas classes na API Java padrão são tratadas de maneira ligeiramente diferente de outras classes. Estou falando sobre aquelas classes que não poderiam ser implementadas sem suporte especial do compilador e / ou JVM.
As que eu proponho imediatamente são:
Object
(obviamente) pois ele, entre outras coisas, não tem uma superclasse.String
já que o idioma tem suporte especial para o operador +.Thread
uma vez que tem este método start () mágico, apesar do fato de que não há nenhuma instrução bytecode que "bifurque" a execução.
Suponho que todas as classes como essas são de uma forma ou de outra mencionadas no JLS. Corrija-me se eu estiver errado.
De qualquer forma, que outras classes existem? Existe alguma lista completa de "classes glorificadas" na linguagem Java?
Respostas:
Existem muitas respostas diferentes, então pensei que seria útil coletar todas (e adicionar algumas):
Aulas
Interfaces
As menções honrosas vão para:
Nota: Eu deixei de fora da lista coisas que fornecem JNI (como IO) porque você sempre poderia implementar sua própria chamada JNI se quisesse. No entanto, as chamadas nativas que interagem com a JVM de maneira privilegiada são diferentes.
Arrays são discutíveis - eles herdam Object, têm uma hierarquia compreendida (Object [] é um supertipo de String []), mas são um recurso de linguagem, não uma classe definida por si só.
fonte
SecurityManager
? Ou qualquer coisa relacionada à reflexão ou serialização?Class
, claro. Ele tem seus próprios literais (uma distinção com a qual ele compartilhaString
, BTW) e é o ponto de partida de toda aquela magia de reflexão.fonte
sun.misc.unsafe é a mãe de todos os hacks sujos e destruidores do espírito da linguagem.
fonte
fonte
Todas as classes de Número têm um pouco de magia na forma de Autoboxing .
fonte
Como as classes importantes foram mencionadas, mencionarei algumas interfaces:
A
Iterable
interface (desde 1.5) - permite que um objeto participe de um loop foreach:A
Serializable
interface tem um significado muito especial, diferente de uma interface padrão. Você pode definir métodos que serão levados em consideração mesmo que não estejam definidos na interface (comoreadResolve()
). Atransient
palavra-chave é o elemento de linguagem que afeta o comportamento dosSerializable
implementadores.fonte
transient
palavraComparable
não participa de nada interno. Você poderia escrever facilmenteNewComparable
e novoNewArrays.sort(..)
com a mesma funcionalidadefonte
Array Java como em
int[].class
fonte
[I
classe;) não é uma classe de API.java.lang.ClassLoader
, embora o trabalho sujo real seja feito por alguma subclasse não mencionada (consulte 12.2.1 O processo de carregamento ).fonte
Não tenho certeza sobre isso. Mas não consigo pensar em uma maneira de implementar manualmente os objetos IO.
fonte
Existe alguma magia na
System
classe.System.arraycopy
é um gancho para o código nativomas...
fonte
Bem, já que o tratamento especial de assert foi mencionado. Aqui estão mais alguns tipos de exceção que têm tratamento especial pelo jvm:
As exceções não são especiais, mas o jvm as usa em casos especiais, portanto, você não pode implementá-las sem escrever seu próprio jvm. Tenho certeza de que existem mais exceções especiais por aí.
fonte
A maioria dessas classes não é realmente implementada com a ajuda 'especial' do compilador ou JVM. O objeto registra alguns nativos que vasculham as estruturas internas da JVM, mas você também pode fazer isso para suas próprias classes. (Eu admito que isso está sujeito à semântica, "chama um nativo definido na JVM" pode ser considerado um suporte especial da JVM.)
O que / é / especial é o comportamento das instruções 'novas' e 'lançadas' sobre como inicializam essas estruturas internas.
No entanto, as anotações e os números são bastante assustadores.
fonte