代理類測試程式碼

longerandlonger發表於2013-01-04
package zhuang_shi_mo_shi;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Proxy;

public class Main {

	public static void main(String[] args) {
		Animal jerry = new Rat();
		jerry = new DecorateAnimal(jerry, FlyFeature.class);
		jerry = new DecorateAnimal(jerry, DigFeature.class);
		jerry.doStuff();
	}

}

interface Animal {
	public void doStuff();
}

class Rat implements Animal {
	@Override
	public void doStuff() {
		System.out.println("Jerry will paly with Tom");
	}
}

// //////////////////////////////////////////////////////////////////////
interface Feature {
	public void laod();
}

class FlyFeature implements Feature {
	@Override
	public void laod() {
		System.out.println("增加一對翅膀");
	}
}

class DigFeature implements Feature {
	@Override
	public void laod() {
		System.out.println("增加鑽地能力");
	};
}

class DecorateAnimal implements Animal {
	private Animal animal;
	private Class<? extends Feature> clazz;

	public DecorateAnimal(Animal animal, Class<? extends Feature> clazz) {
		this.animal = animal;
		this.clazz = clazz;
	}

	@Override
	public void doStuff() {
		InvocationHandler handler = new InvocationHandler() {
			@Override
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				Object obj = null;
				if (Modifier.isPublic(method.getModifiers())) {
					obj = method.invoke(clazz.newInstance(), args);
				}
				animal.doStuff();
				return obj;
			}
			
		};
		
		ClassLoader classLoader = getClass().getClassLoader();
		Feature proxy = (Feature) Proxy.newProxyInstance(classLoader, clazz.getInterfaces(), handler);
		proxy.laod();
	}
}

相關文章