版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/c_royi/article/details/86535472
java静态代理和动态代理
java设计模式中,常说的代理模式使用的是静态代理模式。
代理模式:为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。
- 静态代理:由创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。
- 动态代理:在程序运行时运用反射机制动态创建而成。
静态代理代码
接口和实现类
public interface FoodService {
public void makeNoodle();
public void makeChicken();
}
public class FoodServiceImpl implements FoodService {
@Override
public void makeNoodle() {
System.out.println("make noodle");
}
@Override
public void makeChicken() {
System.out.println("make Chicken");
}
}
静态代理类
public class StaticProxy implements FoodService {
private FoodService foodService;
public StaticProxy(FoodService foodService){
this.foodService = foodService;
}
@Override
public void makeNoodle() {
foodService.makeNoodle();
}
@Override
public void makeChicken() {
foodService.makeChicken();
}
}
调用类
public class Client {
public static void main(String[] args) {
StaticProxy staticProxy = new StaticProxy(new FoodServiceImpl());
staticProxy.makeChicken();
}
}
动态代理
接口和实现类
public interface FoodService {
public void makeNoodle();
public void makeChicken();
}
public class FoodServiceImpl implements FoodService {
@Override
public void makeNoodle() {
System.out.println("make noodle");
}
@Override
public void makeChicken() {
System.out.println("make Chicken");
}
}
动态代理类
//Object proxy:被代理的对象
//Method method:要调用的方法
//Object[] args:方法调用时所需要参数
public class DynamicProxy implements InvocationHandler {
//目标对象
private Object target;
//绑定关系,也就是关联到哪个接口(与具体的实现类绑定)的哪些方法将被调用时,执行invoke方法。
public Object newProxyInstance(Object targetObject){
this.target=targetObject;
//该方法用于为指定类装载器、一组接口及调用处理器生成动态代理类实例
//第一个参数指定产生代理对象的类加载器,需要将其指定为和目标对象同一个类加载器
//第二个参数要实现和目标对象一样的接口,所以只需要拿到目标对象的实现接口
//第三个参数表明这些被拦截的方法在被拦截时需要执行哪个InvocationHandler的invoke方法
//根据传入的目标返回一个代理对象
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
targetObject.getClass().getInterfaces(),this);
}
@Override
//关联的这个实现类的方法被调用时将被执行
/*InvocationHandler接口的方法,proxy表示代理,method表示原对象被调用的方法,args表示方法的参数*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//打印参数
// for(int i=0;i<args.length;i++){
// System.out.println(args[i]);
// }
Object ret=null;
try{
//调用目标方法
ret=method.invoke(target, args);
}catch(Exception e){
e.printStackTrace();
throw e;
}
return ret;
}
}
调用类
public class Client {
public static void main(String[] args){
DynamicProxy dynamicProxy=new DynamicProxy();
FoodService foodService=(FoodService)dynamicProxy.newProxyInstance(new FoodServiceImpl());
//UserManager userManager=new UserManagerImpl();
foodService.makeChicken();
}
}