RelaxedDuckType.java
上传用户:hengxinggs
上传日期:2008-01-15
资源大小:212k
文件大小:2k
源码类别:

PlugIns编程

开发平台:

Java

  1. /*
  2.  * Copyright (C) 2005 db4objects Inc.  http://www.db4o.com
  3.  * 
  4.  * All rights reserved. This program and the accompanying materials
  5.  * are made available under the terms of the Eclipse Public License v1.0
  6.  * which accompanies this distribution, and is available at
  7.  * http://www.eclipse.org/legal/epl-v10.html
  8.  *
  9.  * Contributors:
  10.  *     db4objects - Initial API and implementation
  11.  */
  12. package org.eclipse.jface.examples.databinding.compositetable.reflect;
  13. import java.lang.reflect.InvocationHandler;
  14. import java.lang.reflect.Method;
  15. import java.lang.reflect.Proxy;
  16. import java.util.HashMap;
  17. /**
  18.  * RelaxedDuckType. Implements Duck Typing for Java.  ("If it walks like a duck, 
  19.  * quacks like a duck, it...").  Essentially allows programs to treat
  20.  * objects from separate hierarchies as if they were designed with common
  21.  * interfaces as long as they adhere to common naming conventions.
  22.  * <p>
  23.  * This version is the relaxed DuckType.  If a method in the interface is
  24.  * not present on the underlying object, the proxy simply returns null.
  25.  *
  26.  * @author djo
  27.  */
  28. public class RelaxedDuckType extends DuckType implements InvocationHandler {
  29. public static Object implement(Class interfaceToImplement, Object object) {
  30. return Proxy.newProxyInstance(interfaceToImplement.getClassLoader(), 
  31. new Class[] {interfaceToImplement}, new RelaxedDuckType(object));
  32. }
  33.     
  34.     public static boolean includes(Object object, String method, Class[] args) {
  35.         try {
  36.             Method realMethod = object.getClass().getMethod(method, args);
  37.         } catch (NoSuchMethodException e) {
  38.             return false;
  39.         }
  40.         return true;
  41.     }
  42.     
  43.     private static final HashMap NULL_VALUES = new HashMap(); {
  44.         NULL_VALUES.put(Boolean.TYPE, Boolean.FALSE);
  45.         NULL_VALUES.put(Integer.TYPE, new Integer(0));
  46.         NULL_VALUES.put(Float.TYPE, new Float(0));
  47.         NULL_VALUES.put(Long.TYPE, new Long(0));
  48.         NULL_VALUES.put(Double.TYPE, new Double(0));
  49.         NULL_VALUES.put(Character.TYPE, new Character(' '));
  50.     }
  51. protected RelaxedDuckType(Object object) {
  52. super(object);
  53. }
  54. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  55. try {
  56. Method realMethod = objectClass.getMethod(method.getName(), method.getParameterTypes());
  57.             return realMethod.invoke(object, args);
  58. } catch (NoSuchMethodException e) {
  59. return NULL_VALUES.get(method.getReturnType());
  60. } catch (Throwable t) {
  61. throw t;
  62. }
  63. }
  64. }