kleberdamasco ,
Até é possível saber, em tempo de execução, se o método foi sobrescrito, com algumas ressalvas. Abaixo coloquei um exemplo, utilizando três classes:
package br;
public class ClassZ {
public static void main( String[] args ){
ClassA classA = new ClassA();
classA.method1();
System.out.println( "-----------------" );
ClassB classB = new ClassB();
classB.method1();
}
}
package br;
public class ClassB extends ClassA{
@Override
public void method1(){
super.method1();
}
}
package br;
public class ClassA {
public void method1(){
this.analisaChamador();
}
private void analisaChamador(){
try{
throw new Exception(); //Força o disparo de exception.
}
catch( Exception e ){
StackTraceElement elementChamador = e.getStackTrace()[2];
System.out.println( "Método Chamador: " + elementChamador );
try{
Class classChamador = Class.forName( elementChamador.getClassName() );
if( !ClassA.class.equals( classChamador ) ){
if( classChamador.isInstance( this ) && classChamador.getMethod( "method1" ) != null ){
System.out.println( "Método SOBRESCRITO. :)" );
}
else{
System.out.println( "O método chamador NÃO pertence a uma classe filha desta ou NÃO está sobrescrito. :(" );
}
}
else{
System.out.println( "Método chamador pertence a esta classe. :(" );
}
}
catch( Exception ex ){
ex.printStackTrace();
}
}
}
}
Realizei dois testes (ver classe ClassZ), abaixo descritos:
No 1º, a chamada ao método method1 foi realizada diretamente pela classe ClassZ, a qual não herda da ClassA.
No 2º, a chamada ao método method1 foi realizada através da classe ClassB, a qual herda da ClassA, e que sobrescreve o método.