一.静态代理
1。先定义一个接口以及接口中的方法
public interface UserInterface {
void save();
}
2。接口的实现类
/**
* 接口实现
* 目标对象
*/
public class User implements UserInterface{
@Override
public void save() {
// TODO Auto-generated method stub
System.out.println("执行了User对象的save方法");
}
}
3。编写代理类
public class UserProxy implements UserInterface{
private User target;
public UserProxy(User target){
this.target = target;
}
public void save(){
System.out.println("开始执行UserProxy类的save方法");
target.save();
System.out.println("结束执行UserProxy类的save方法");
}
}
4。测试类
public class Test {
/**
*
* 静态代理总结:
1.可以做到在不修改目标对象的功能前提下,对目标功能扩展.
2.缺点:
因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多.同时,一旦接口增加方法,目标对象与代理对象都要维护.
如何解决静态代理中的缺点呢?答案是可以使用动态代理方式
* @param args
*/
public static void main(String[] args) {
User user = new User();
UserProxy userProxy = new UserProxy(user);
userProxy.save();
}
}
二。动态代理
1。代理工厂
public class ProxyFactory {
private Object target;
public ProxyFactory(Object target){
this.target = target;
}
// public Object getProxyInstance(){
// return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
//
// @Override
// public Object invoke(Object proxy, Method method, Object[] args)
// throws Throwable {
// // TODO Auto-generated method stub
// System.out.println("开始执行代理");
// Object returnValue = method.invoke(target, args);
// System.out.println("结束了执行代理");
// return returnValue;
// }
// });
// }
public Object getProxyInstance(){
//被代理类的类加载器
ClassLoader classLoader = target.getClass().getClassLoader();
//被代理类的接口
Class<?>[] interfaces = target.getClass().getInterfaces();
//代理类执行,执行某个类的某个方法,并传入方法入参,获得返回值
InvocationHandler invocationHandler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
System.out.println("开始执行代理");
Object returnValue = method.invoke(target, args);
System.out.println("结束了执行代理");
return returnValue;
}
};
//返回代理类
Object proxy = Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
return proxy;
}
}
2。测试类(主要就是定义的时候,都定义为接口类型,具体实现看具体情况)
public class Test {
public static void main(String[] args) {
UserInterface target = new User();
System.out.println(target.getClass());
UserInterface proxy = (UserInterface) new ProxyFactory(target).getProxyInstance();
System.out.println(proxy.getClass());
proxy.save();
}
}