java jdk反射自带动态代理,但只支持接口的实现代理,spring的AOP的底层实现就是使用了动态代理。
接口:
package com.hanyastar.demo;
public interface IUsers {
public void save(String username, String password);
public void update(String id, String usrname, String password);
}
实现类
package com.hanyastar.demo;
public class UsersImpl implements IUsers{
public void save(String username, String password) {
System.out.println("保存了一个新的用户信息。用户名是" + username + ",密码是:" + password);
}
public void update(String id, String usrname, String password) {
System.out.println("修改了ID为" + id + "的用户信息,修改后的用户名为:" + usrname
+ ",密码为:" + password);
}
}
代理类
package com.hanyastar.demo.jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* JDK动态代理。
* @created 2013-8-9
*/
public class DynamicProxy implements InvocationHandler{
/**
* <p>被代理的对象。</p>
* @created 2013-8-9
*/
private Object target;
public DynamicProxy(Object target) {
this.target = target;
}
/**
* 调用对象。
* @param o 被代理的对象。
* @param method 被代理对象的方法。
* @param args 被代理对象的方法的参数。
* @return proxy result
*
* @throws Throwable
* @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
*/
public Object invoke(Object o, Method method, Object[] args)
throws Throwable {
System.out.println("代理开始....");
Object result = method.invoke(target, args);
System.out.println("代理结束...");
return result;
}
/**
* <p>动态获得被代理的对象。</p>
* @created 2013-8-9
*/
public Object getProxy(){
// ClassLoader loader 类加载器
// Class<?>[] interfaces 得到全部的接口
// InvocationHandler InvocationHandler 接口的子类实例
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
}
}
测试
package com.hanyastar.demo.jdk;
import com.hanyastar.demo.IUsers;
import com.hanyastar.demo.UsersImpl;
/**
* 测试动态代理。
* @created 2013-8-9
*/
public class TestAOP {
public static void main(String[] args) {
// 向上造型
// 代理接口的实现类。
IUsers d = (IUsers)new DynamicProxy(new UsersImpl()).getProxy();
d.save("a", "b");
d.update("2", "aaa", "bbb");
}
}
输出
代理开始....
保存了一个新的用户信息。用户名是a,密码是:b
代理结束...
代理开始....
修改了ID为2的用户信息,修改后的用户名为:aaa,密码为:bbb
代理结束...
源码下载: http://download.youkuaiyun.com/detail/programmer_sir/5898127