动态代理 java
代理工具类
/** * created on Jan 13, 2010 9:34:18 AM * * Copyright 2001-2010 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package dynamicProxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.util.Date;/** * @author * */public class DynamicLogger implements InvocationHandler { private Object target; public Object newProxyObject(Object target) { // 在JVM中动态生成代理类 this.target = target; return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } public DynamicLogger() { } /* * (non-Javadoc) * * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, * java.lang.reflect.Method, java.lang.Object[]) */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { before(); System.out.println("invoke method is "+method.getName()); Object result = method.invoke(target, args); after(); // System.out.println(proxy); return result; } private void before() { System.out.println("now is " +new Date()); } private void after() { System.out.println("now is " +new Date()); }}
?
?
?
接口
public interface IPerson { void speak(); void walk();}
?
?
实现
public class RealPerson implements IPerson { private String name; /** * @param name */ public RealPerson(String name) { super(); this.name = name; } /* * (non-Javadoc) * * @see dynamicProxy.IPerson#speak() */ public void speak() { System.out.println(name+ " is speak"); } /* * (non-Javadoc) * * @see dynamicProxy.IPerson#walk() */ public void walk() { System.out.println(name+ " is walk"); }}
?
?
测试
public class Client extends TestCase { public void testProxy() throws Exception { IPerson Warrior=new RealPerson("Warrior"); IPerson Priest=new RealPerson("Priest"); DynamicLogger log1=new DynamicLogger(); DynamicLogger log2=new DynamicLogger(); IPerson proxyWarrior=(IPerson) log1.newProxyObject(Warrior); IPerson proxyPriest=(IPerson) log2.newProxyObject(Priest); proxyWarrior.walk(); proxyWarrior.speak(); System.out.println("===="); proxyPriest.walk(); proxyPriest.speak(); }}
?
?
输出
now is Wed Jan 13 10:05:59 CST 2010invoke method is walkWarrior is walknow is Wed Jan 13 10:05:59 CST 2010now is Wed Jan 13 10:05:59 CST 2010invoke method is speakWarrior is speaknow is Wed Jan 13 10:05:59 CST 2010====now is Wed Jan 13 10:05:59 CST 2010invoke method is walkPriest is walknow is Wed Jan 13 10:05:59 CST 2010now is Wed Jan 13 10:05:59 CST 2010invoke method is speakPriest is speaknow is Wed Jan 13 10:05:59 CST 2010
?