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

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. /**
  17.  * DuckType. Implements Duck Typing for Java.  ("If it walks like a duck, 
  18.  * quacks like a duck, it...").  Essentially allows programs to treat
  19.  * objects from separate hierarchies as if they were designed with common
  20.  * interfaces as long as they adhere to common naming conventions.
  21.  * <p>
  22.  * This version is the strict DuckType.  All methods present in
  23.  * interfaceToImplement must be present on the target object.
  24.  *
  25.  * @author djo
  26.  */
  27. public class DuckType implements InvocationHandler {
  28. /**
  29.      * Causes object to implement the interfaceToImplement and returns
  30.      * an instance of the object implementing interfaceToImplement even
  31.      * if interfaceToImplement was not declared in object.getClass()'s 
  32.      * implements declaration.<p>
  33.      * 
  34.      * This works as long as all methods declared in interfaceToImplement
  35.      * are present on object.
  36.      * 
  37.  * @param interfaceToImplement The Java class of the interface to implement
  38.  * @param object The object to force to implement interfaceToImplement
  39.  * @return object, but now implementing interfaceToImplement
  40.  */
  41. public static Object implement(Class interfaceToImplement, Object object) {
  42. return Proxy.newProxyInstance(interfaceToImplement.getClassLoader(), 
  43. new Class[] {interfaceToImplement}, new DuckType(object));
  44. }
  45.     
  46.     /**
  47.      * Indicates if object is a (DuckType) instace of intrface.  That is,
  48.      * is every method in intrface present on object.
  49.      * 
  50.      * @param intrface The interface to implement
  51.      * @param object The object to test
  52.      * @return true if every method in intrface is present on object.  false otherwise
  53.      */
  54.     public static boolean instanceOf(Class intrface, Object object) {
  55.         final Method[] methods = intrface.getMethods();
  56.         Class candclass=object.getClass();
  57.         for (int methodidx = 0; methodidx < methods.length; methodidx++) {
  58.             Method method=methods[methodidx];
  59.             try {
  60.                 candclass.getMethod(method.getName(), method.getParameterTypes());
  61.             } catch (NoSuchMethodException e) {
  62.                 return false;
  63.             }
  64.         }
  65.         return true;
  66.     }
  67. protected DuckType(Object object) {
  68. this.object = object;
  69. this.objectClass = object.getClass();
  70. }
  71. protected Object object;
  72. protected Class objectClass;
  73. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  74. Method realMethod = objectClass.getMethod(method.getName(), method.getParameterTypes());
  75. return realMethod.invoke(object, args);
  76. }
  77. }