Dato un nome classe completo che può può essere caricato con Class.forName(), c'è un modo per trasformare il nome in quello che sarebbe il risultato del caricamento della classe e invocando getSimpleName() senza effettivamente tentare di caricare il classe? Ho bisogno di questa capacità per scopi di riflessione.Qual è il modo migliore per approssimare class.getSimpleName() senza caricare la classe?
risposta
Devo dire che non è possibile farlo semplicemente in base al nome.
Si può cercare di dividere il .
e $
, ma questo codice di esempio dimostra che non è sempre ovvio dove inizia il semplice nome:
class Ideone
{
private static class Bar {};
public static void main (String[] args) throws java.lang.Exception
{
class Foo$o {
class Bar$bar {}
};
class Foo$o$Bar {
class Bar$bar {}
};
class Foo$o$Bar$Bar$bar {}
print(Ideone.class);
print(Bar.class);
print(Foo$o.class);
print(Foo$o.Bar$bar.class);
print(Foo$o$Bar.Bar$bar.class);
print(Foo$o$Bar$Bar$bar.class);
}
private static void print(Class<?> clazz) {
System.out.printf("fqn=%s, sn=%s%n", clazz.getName(), clazz.getSimpleName());
}
}
uscita:
fqn=Ideone, sn=Ideone
fqn=Ideone$Bar, sn=Bar
fqn=Ideone$1Foo$o, sn=Foo$o
fqn=Ideone$1Foo$o$Bar$bar, sn=Bar$bar
fqn=Ideone$1Foo$o$Bar$Bar$bar, sn=Bar$bar
fqn=Ideone$2Foo$o$Bar$Bar$bar, sn=Foo$o$Bar$Bar$bar
ie se dovessi dire "il bit del nome dopo l'ultimo $
o .
", ti sbaglieresti.
L'unico modo conclusivo per fare questo è quello di caricare la classe, potenzialmente senza inizializzarla:
Class<?> clazz = Class.forName(className, false, someClassLoadeR);
Oppure vieni con un set completo di casi - come hai dimostrato non ce ne sono molti - e implementalo. Il test unitario sarebbe ben banale. –
@BoristheSpider ma potresti avere una classe nidificata chiamata 'Fo' con una classe nidificata chiamata' o'. –
Oh, in realtà, vedo - c'è un '1' presente nel nome della classe locale. –
Come dimostrato dalla risposta di @AndyTurner non si può derivare il nome semplice dalla stringa di classe qualificato in tutte le casi.
Ma se il vincolo senza in realtà il tentativo di caricare la classe non vieta di leggere il contenuto del file di classe, si potrebbe procedere come segue (per i casi limite):
- Prendi un
InputStream
per il contenuto del file di classe tramiteClass.getResourceAsStream()
- Analizzare l'inizio del file di classe e leggere il nome di super classe dal pool costante.
- (come commentato da @shmosel) Implementare la logica di
Class.getSimpleName()
. Il nome di super classe ti consente di sostituireClass.getSimpleBinaryString()
che si basa su una classe già caricata.
Questo sembra molto divertente invece di caricare la classe. –
@AndyTurner l'OP saprà se ne vale la pena. – wero
- 1. Qual è il modo migliore per impaginare una classe C#?
- 2. il modo migliore per caricare script dinamici
- 3. Qual è il modo migliore per imparare la WCF?
- 4. Qual è il modo migliore per estendere le funzionalità?
- 5. Qual è il modo migliore per restituire un Enumeratore :: Lazy quando la classe non definisce #each?
- 6. Qual è la migliore strategia per il caricamento delle proprietà?
- 7. Qual è il modo migliore per attuare questo GetHashCode composito()
- 8. Qual è il modo migliore per svuotare una directory?
- 9. Qual è il modo migliore per documentare il codice f #?
- 10. Qual è il modo migliore per riutilizzare il parser Lua?
- 11. Qual è il modo migliore per gestire più azioni?
- 12. Qual è il modo migliore per passare alla codifica MVC?
- 13. Qual è il modo migliore per rilevare l'eccezione nell'attività?
- 14. Qual è il modo migliore per imparare Django 1.5?
- 15. Qual è il modo migliore per generare automaticamente getter e setter per una classe in php?
- 16. Qual è il modo migliore per testare un'app per rails?
- 17. Qual è il modo migliore per eseguire un'espressione matematica?
- 18. Qual è il modo migliore per rilevare il colore bianco?
- 19. Qual è il modo migliore per verificare se l'utente può caricare file?
- 20. Qual è il modo migliore per caricare file con ASP.NET MVC 2?
- 21. Qual è il modo migliore per caricare file in un browser moderno
- 22. Qual è il modo migliore per analizzare questo in C++?
- 23. Qual è il modo migliore per caricare pigro gli annunci doubleclick che utilizzano document.write?
- 24. Qual è il modo migliore per caricare e archiviare le immagini sul sito?
- 25. Qual è il modo migliore per salvare e caricare un registro attività in PHP?
- 26. Qual è il modo migliore per inizializzare i membri condivisi in una classe in VB.NET?
- 27. Il modo migliore per caricare dati esterni in Android
- 28. Qual è il modo migliore per attivare le stampe Python?
- 29. Qual è il modo migliore per scrivere commenti in C?
- 30. Qual è il modo migliore per eseguire un'inizializzazione costosa?
Suppongo che si debba implementare la logica da soli: si tratta principalmente dell'ottenere l'ultimo elemento in una stringa ''. Separata '; con alcune campane e fischietti ... –
@BoristheSpider e la stringa potrebbero anche contenere un '$' – wero
@wero yup, "campane e fischietti" - se è '\ $ \ d + $' quindi 'null', altrimenti diviso in' $ '. –