voiloù le code d'un proxy typique :
Code :
- class ProxyInutile implements InvocationHandler {
- private Object sujet;
- public ProxyInutile(Object sujet) {
- this.sujet = sujet;
- }
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- method.invoke(sujet, args);
- }
- }
- ...
- ArrayList monObj = new ArrayList();
- ArrayList proxy = (ArrayList)Proxy.newProxyInstance(
- ArrayList.class.getClassLoader(),
- new Class[] { ArrayList.class },
- new ProxyInutile(monObj));
- monObj.get(-12); // ça va planter chérie !
- ...
|
la dernière ligne de code ne renvoie non pas un IndexOutOfBoundsException comme on pourrait le croire naïvement, mais un InvocationTargetException, avec la cause kivabien, soit le IndexOutOfBoundsException tant attendu, comme marqué dans la doc de invoke().
La question est : il est très tentant de modifier le handler comme suit
Code :
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- try {
- method.invoke(sujet, args);
- } catch (InvocationTargetException e) {
- throw e.getCause();
- }
- }
|
C'est une bonne idée ou un piège à con ?
Si c'est un piège à con, où est le problème ?
Si c'est est pas un, pourquoi ça n'a pas été fait dans Method.invoke() directement ? pour ne pas fausser le point d'origine de l'exception ?
---------------
trainoo.com, c'est fini