下面通过一个项目中经常用到的功能来举下动态代理是实例,实例有2个功能:1是记录用户登录的日志。2是计算一下添加算法的时间。为了简单起见,2个功能忽略了详细算法。如果使用静态代理就得建2个代理类,分别做这2个功能,如果功能很多,就要建立很多类。使用动态代理的好处就是建立一个类就可以搞定。
用户登录
package com.zhouyu.myProxy;
public interface UserDao
{
public boolean login(String username,String password);
}
package com.zhouyu.myProxy;
public class UserDaoImpl implements UserDao
{
@Override
public boolean login(String username, String password)
{
if("zy".equals(username) && "1234".equals(password))
{
return true;
}
return false;
}
}
动态代理类,2个功能的代理都放在这里
package com.zhouyu.myProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Date;
public class MyProxy implements InvocationHandler
{
private Object object;
public MyProxy(Object object)
{
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
if("login".equals(method.getName()) && "zy".equals(args[0]) && "1234".equals(args[1]))
{
System.out.println("Log i :" +args[0] + "用户登录成功 " + new Date());
}
Object result = method.invoke(object,args);
return result;
}
}
客户端调用
package com.zhouyu.myProxy;
import java.lang.reflect.InvocationHandler;
public class Client
{
public static void main(String[] args)
{
UserDao ud = new UserDaoImpl();
InvocationHandler proxy = new MyProxy(ud);
ClassLoader classLoader = ud.getClass().getClassLoader();
UserDao dao = (UserDao) java.lang.reflect.Proxy.newProxyInstance(classLoader, new Class[]{UserDao.class}, proxy);
boolean bl = dao.login("zy","1234");
System.out.println(bl);
}
}
这个功能就是使用动态代理记录zy用户的登录的时间。如果用户名和密码正确,运行结果为:
Log i :zy用户登录成功 Wed Jul 10 10:35:45 CST 2013
true
如果用户名或密码错误,运行结果为
false
下面代码是计算一下添加算法的时间
package com.zhouyu.myProxy;
public interface MakeDao
{
public void save(String str) throws InterruptedException;
}
package com.zhouyu.myProxy;
import java.util.Random;
public class MakeDaoImpl implements MakeDao
{
@Override
public void save(String str)
{
System.out.println(str + " 添加成功");
//模拟了该算法的运行时间
try
{
Thread.sleep(new Random().nextInt(100));
}
catch (Exception e)
{
System.out.println(e.toString());
}
}
}
还是刚才那个代理类,添加了一些代码
package com.zhouyu.myProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Date;
public class MyProxy implements InvocationHandler
{
private Object object;
public MyProxy(Object object)
{
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
if("login".equals(method.getName()) && "zy".equals(args[0]) && "1234".equals(args[1]))
{
System.out.println("Log i :" +args[0] + "用户登录成功 " + new Date());
}
long start = 0;
long end = 0;
if("save".equals(method.getName()))
{
start = System.currentTimeMillis();
}
Object result = method.invoke(object,args);
if("save".equals(method.getName()))
{
end = System.currentTimeMillis();
System.out.println("运行时间为:" + (end - start));
}
return result;
}
}
客户端调用
package com.zhouyu.myProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class MakeAction
{
public static void main(String[] args) throws Exception
{
MakeDao md = new MakeDaoImpl();
InvocationHandler h = new MyProxy(md);
ClassLoader classLoader = md.getClass().getClassLoader();
MakeDao make = (MakeDao) Proxy.newProxyInstance(classLoader,new Class[]{MakeDao.class},h);
make.save("abc");
make.save("def");
}
}
运行结果为
abc 添加成功
运行时间为:93
def 添加成功
运行时间为:80