java - externas - Llamando al nuevo método definido desde la clase anónima
funciones anonimas java (5)
Básicamente no.
Esta fealdad puede hacerlo sin embargo ...
Date date = new Date() {
public Date someMethod() {
//do some stuff here
return this;
}
}.someMethod();
Pero aparte de esto, solo podrás llamar a ese método (que no existe en la clase padre) usando solo la reflexión, como esto:
date.getClass().getMethod("someMethod").invoke(date);
(try-catch omitido por razones de claridad ...)
Pero en serio, ¡no hagas esto! Me sentiría odiado por la persona que escribió este código, si me topara con esto en un código base en el que tengo que trabajar.
Instalé un objeto de una clase anónima a la que agregué un nuevo método.
Date date = new Date() {
public void someMethod() {}
}
Me pregunto si es posible llamar a este método desde el exterior de alguna manera similar a:
date.someMethod();
Buena pregunta. La respuesta es No. No puede llamar directamente a date.someMethod();
Entendamos primero que es esto.
Date date = new Date() { ... };
La anterior es una subclase anónima (no tiene nombre) que extiende la clase Fecha.
Cuando ves el código como,
Runnable r = new Runnable() {
public void run() {
}
};
Significa que ha definido una clase anónima (no tiene nombre) que implementa (no extiende) la interfaz Runnable.
Por lo tanto, cuando llama a date.someMethod()
, no podrá llamar porque someMethod
no está definido en la superclass.
En el caso anterior, la superclase es la clase Date
. Sigue simples reglas primordiales.
Pero aún así, si desea llamar a someMethod
continuación, siga el paso.
Manera segura>
Con la variable de referencia '' date
''
date.getClass().getMethod("someMethod").invoke(date);
Segunda vía>
Con la subclase anónima recién creada del objeto de la clase Date.
new Date()
{
public void someMethod() {
System.out.println("Hello");
}
}.someMethod(); //this should be without reference ''date''
No sé por qué haría esto, pero tal como está escrito no es posible, porque Date
no declara someMethod
.
Sin embargo, puede declarar una clase local dentro del método, por ejemplo:
void foo ( )
{
class MyDate extends Date
{
public void someMethod( );
}
MyDate date = new MyDate( );
date.someMethod( );
}
Una vez más, sugeriría usar una clase normal
primero, porque las clases locales, por su naturaleza, no se pueden evaluar.
No, para eso son las clases de métodos locales.
class MyDate extends Date() {
public void someMethod() {...}
}
MyDate date = new MyDate();
date.someMethod();
Sin usar la reflexión, no se puede: el método no forma parte de la API de date
y la date
es solo una fecha en lo que respecta al compilador.
La única forma en que puede usar someMethod
es llamándolo directamente a la instancia recién creada:
new Date() { public void someMethod() { } }.someMethod();