Bir Interface’i implement eden sınıfın bazı metotlarını override etmek ya da yeni metot eklemek istiyorsanız normal şartlarda o sınıfı extend edersiniz ya da interface i implement edip tek tek metotlardan istediğinizi eski sınıftan çağırır istediğinizi de yeniden yazarsınız. Ancak eski sınıfa erişemiyor ve interface te çok fazla metot var ise  Dynamic Proxy Class çözümünü düşünebilirsiniz. Olayın temeli java reflection API’ye bağlı. Çağırmak istediğinizi sınıfın metotolarını reflection ile çağırıyorsunuz. Override etmek istedikleriniz için ise kontrol ekleyip kendi metotlarınıza yönlediriyorsunuz.

Örnek:

public class MyResultSet implements InvocationHandler {
ResultSet rs;
PreparedStatement ps;
private Method closeMethod;

public MyResultSet(ResultSet rs) {
super();
this.rs = rs;
try {
closeMethod = ResultSet.class.getMethod(“close”,null);
} catch (NoSuchMethodException | SecurityException e) {

e.printStackTrace();
}
}

public void close() {
try {
Top.getStaticLogger().debug(“MyResultSet”);
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}

}

public static Object newInstance(ResultSet rs) {
return java.lang.reflect.Proxy.newProxyInstance(rs.getClass().getClassLoader(), rs.getClass().getInterfaces(),
new MyResultSet(rs));
}

public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
Object result = null;
try {
Class declaringClass = m.getDeclaringClass();

if (m.getName().compareTo(“close”)==0) {
System.out.println(“close method PAYS ” + m.getName());

close();
} else {

System.out.println(“before method ” + m.getName());
result = m.invoke(rs, args);
}
} catch (InvocationTargetException e) {
throw e.getTargetException();
} catch (Exception e) {
throw new RuntimeException(“unexpected invocation exception: ” + e.getMessage());

} finally {
System.out.println(“after method ” + m.getName());
}
return result;

}
}

—Kulanımı:

ResultSet prs = (ResultSet) MyResultSet.newInstance(rs);

 

Referans:

https://docs.oracle.com/javase/1.5.0/docs/guide/reflection/proxy.html

New Tricks with Dynamic Proxies in Java 8 (part 2)