静态代理:
package proxy.statics;
interface UserService{
public void saveUser();
}
class UserServiceImpl implements UserService{
@Override
public void saveUser() {
System.out.println("2.保存用户信息");
}
}
class StaticProxy implements UserService{
private UserService userService;
private void open(){
System.out.println("1.打开数据库连接");
}
@Override
public void saveUser() {
this.open();
userService.saveUser();
}
public StaticProxy(UserService userService) {
this.userService=userService;
}
}
public class TestStaticProxy {
public static void main(String[] args) {
UserService userService=new StaticProxy(new UserServiceImpl());
userService.saveUser();
}
}
运行结果:
1.打开数据库连接
2.保存用户信息
动态代理:
package proxy.dynamic;
import java.lang.annotation.Target;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface UserService{
public void saveUser();
}
class UserServiceImpl implements UserService{
@Override
public void saveUser() {
System.out.println("2.保存用户信息");
}
}
class DynamicProxy implements InvocationHandler{
private Object target=null;
private void open(){
System.out.println("1.打开数据库连接");
}
/**
*
loader - 定义代理类的类加载器
interfaces - 代理类要实现的接口列表
h - 指派方法调用的调用处理程序
*/
public Object getProxy(Object object) {
this.target=object;
//可以这样写
/*Interface proxy=(interface)Proxy.newProxyInstance(object.getClass().getClassLoader(),
object.getClass().getInterfaces(), this);*/
return Proxy.newProxyInstance(object.getClass().getClassLoader(),
object.getClass().getInterfaces(), this);
}
/**
* Ojbect proxy:表示需要代理的对象
Method method:表示要操作的方法
Object[] args:method方法所需要传入的参数(可能没有为,null.也可能有多个)
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
open();
Object result=method.invoke(target, args);
return result;
}
}
public class TestDynamicProxy {
public static void main(String[] args) {
UserService userService=(UserService) new DynamicProxy().getProxy(new UserServiceImpl());
userService.saveUser();
}
}
运行结果:
1.打开数据库连接
2.保存用户信息