¿Cuál es la diferencia entre getName(), getCanonicalName() y getSimpleName() en Java?
¡Hola! Acabo de empezar a estudiar reflexión en Java y me encontré con tres métodos: `getName()`, `getCanonicalName()` y `getSimpleName()`. No entiendo bien en qué se diferencian.
Por ejemplo, tengo una clase simple `Person` en el paquete `com.example.model`. Intenté escribir este código:
```java
package com.example.model;
public class Person {
public static void main(String[] args) {
Class> clazz = Person.class;
System.out.println("getName: " + clazz.getName());
System.out.println("getSimpleName: " + clazz.getSimpleName());
System.out.println("getCanonicalName: " + clazz.getCanonicalName());
}
}
```
Los tres métodos muestran algo similar: `getName` muestra `com.example.model.Person`, `getSimpleName` — solo `Person`, y `getCanonicalName` — también `com.example.model.Person`. Pero he oído que para clases anidadas o arrays pueden diferir. ¿Puedes explicar con ejemplos reales en qué situaciones estos métodos dan resultados diferentes?