静态代理
1.定义接口
package designpatterns.proxypatterns;
public interface Animal {
void fly();
}
2.定义接口实现类
package designpatterns.proxypatterns;
public class AnimalImp implements Animal {
@Override
public void fly() {
System.out.println("飞起来了");
}
}
3.将接口实现类的对象作为变量传入代理类中,在代理类中实现增强代码的部分,真正的方法调用还是用实现类的对象进行调用
package designpatterns.proxypatterns;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class StaticProxyAnimalImp {
private Animal animal;
public static Logger logger = LogManager.getLogger(StaticProxyAnimalImp.class);
StaticProxyAnimalImp(Animal animal){
this.animal = animal;
}
public void fly(){
logger.info("起飞前的动作");
animal.fly();
logger.info("起飞后的动作");
}
public static void main(String[] args) {
StaticProxyAnimalImp staticProxyAnimalImp = new StaticProxyAnimalImp(new AnimalImp());
staticProxyAnimalImp.fly();
}
}
动态代理
1.使用Proxy中的newProxyInstance方法直接获取代理对象,重写InvocationHandler中的invoke方法,实现增强功能,同时执行实现类中的方法
package designpatterns.proxypatterns;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.lang.reflect.*;
public class DynamicProxy {
public static Logger logger = LogManager.getLogger(DynamicProxy.class);
public static Object getProxy(Object target){
// getProxyClass 获取代理类的Class对象,getConstructor获取代理类的构造器,使用构造器的newInstance生成代理对象
// Class<?> proxyClass = Proxy.getProxyClass(target.getClass().getClassLoader(), target.getClass().getInterfaces());//获取代理类的Class类
// Constructor<?> constructor = proxyClass.getConstructor(InvocationHandler.class);//获取代理类的构造器,这里为什么传入InvocationHandler.class?
// Object proxy = constructor.newInstance(new InvocationHandler() {
// @Override
// public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// logger.info("方法执行前");
// Object object = method.invoke(target, args);//利用反射执行实现类中的方法
// logger.info("方法执行后");
// return object;
// }
// })
// return proxy;
/**
* newProxyInstance直接获取代理对象,
* ClassLoader loader 定义代理类的类加载器
* Class<?>[] interfaces 代理类要实现的接口列表
* InvocationHandler h 将方法调用分派到的调用处理程序
**/
Object o = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler(){
@Override
//这里写代理的增强代码,包含实现类中的方法执行
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
logger.info("方法执行前");
Object object = method.invoke(target, args);//利用反射执行实现类中的方法
logger.info("方法执行后");
return object;
}
});
return o;
}
public static void main(String[] args) {
AnimalImp animalImp = new AnimalImp();
Animal animalProxy = (Animal) getProxy(animalImp);
animalProxy.fly();
}
}