代理类测试代码

来源:互联网 发布:外企软件侵权案例 编辑:程序博客网 时间:2024/06/05 01:56
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 {@Overridepublic void doStuff() {System.out.println("Jerry will paly with Tom");}}// //////////////////////////////////////////////////////////////////////interface Feature {public void laod();}class FlyFeature implements Feature {@Overridepublic void laod() {System.out.println("增加一对翅膀");}}class DigFeature implements Feature {@Overridepublic 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;}@Overridepublic void doStuff() {InvocationHandler handler = new InvocationHandler() {@Overridepublic 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();}}