/* * Copyright (C) 2004 Joe Walnes. * Copyright (C) 2006, 2007, 2008 XStream Committers. * All rights reserved. * * The software in this package is published under the terms of the BSD * style license a copy of which has been included with this distribution in * the LICENSE.txt file. * * Created on 25. April 2004 by Joe Walnes */ package com.thoughtworks.acceptance.objects; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class SampleDynamicProxy implements InvocationHandler { private String aField = "hello"; public static interface InterfaceOne { String doSomething(); } public static interface InterfaceTwo { String doSomething(); } public static Object newInstance() { return Proxy.newProxyInstance(InterfaceOne.class.getClassLoader(), new Class[]{InterfaceOne.class, InterfaceTwo.class}, new SampleDynamicProxy()); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getName().equals("equals")) { return equals(args[0]) ? Boolean.TRUE : Boolean.FALSE; } else if (method.getName().equals("hashCode")) { return new Integer(System.identityHashCode(proxy)); } else { return aField; } } public boolean equals(Object obj) { return equalsInterfaceOne(obj) && equalsInterfaceTwo(obj); } private boolean equalsInterfaceOne(Object o) { if (o instanceof InterfaceOne) { InterfaceOne interfaceOne = (InterfaceOne) o; return aField.equals(interfaceOne.doSomething()); } else { return false; } } private boolean equalsInterfaceTwo(Object o) { if (o instanceof InterfaceTwo) { InterfaceTwo interfaceTwo = (InterfaceTwo) o; return aField.equals(interfaceTwo.doSomething()); } else { return false; } } }