动态代理
一.静态代理
静态代理是代理模式的实现方式之一,程序编译时生成.class文件,如果我们需要很多的代理,每一个都这么手动的去创建实属浪费时间,而且会有大量的重复代码。
1.定义接口
2.创建具体实现类
3.创建代理类
4.测试
public interface User {
void eat(String name);
}
public class UserImpl implements User {
public void eat(String name) {
System.out.println("我要吃"+name);
}
}
public class UserProxy implements User {
private UserImpl user=new UserImpl();
public void eat(String name) {
System.out.println("静态代理前置");
user.eat(name);
System.out.println("静态代理后置");
}
}
public class Main {
public static void main(String[] args) {
UserProxy userProxy=new UserProxy();
userProxy.eat("橙子");
}
}
二.动态代理
动态代理类在运行时创建生成
JDK动态代理:
1.定义接口
2.创建具体实现类
3.创建代理类(实现InvocationHandler接口),重写invoke方法
4.测试,通过Proxy的静态方法:newProxyInstance(ClassLoader loader,Class[] interfaces,Invocation Handler h)创建一个代理对象
然后通过代理对象调用方法
public interface User {
void eat(String name);
}
public class UserImpl implements User {
public void eat(String name) {
System.out.println("我要吃"+name);
}
}
public class UserProxy implements InvocationHandler {
private Object object;
public UserProxy(Object obj){
this.object=obj;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("前置内容");
method.invoke(object,args);
System.out.println("后置内容");
return null;
}
}
public class Main {
public static void main(String[] args) {
User user=new UserImpl();
InvocationHandler handler=new UserProxy(user);
User user2=(User) Proxy.newProxyInstance(
User.class.getClassLoader(),new Class[]{User.class},handler);
user2.eat("苹果");
}
}
Cglib动态代理:
JDK动态代理拥有局限性,那就是必须面向接口编程,没有接口就无法实现代理
依靠继承来实现动态代理的方式,不再要求我们必须要有接口
1.创建具体类
2.创建代理类(实现MethodInterceptor接口),重写intercept方法
3.测试
public class User {
public void eat(String name){
System.out.println("我要吃"+name);
}
}
public class UserProxy implements MethodInterceptor {
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("前置处理");
Object object=methodProxy.invokeSuper(o,objects);
System.out.println("后置处理");
return object;
}
}
public class Main {
public static void main(String[] args) {
Enhancer enhancer=new Enhancer(); //字节码增强器
enhancer.setSuperclass(User.class); //设置被代理类为父类
enhancer.setCallback(new UserProxy()); //设置回调
User user=(User)enhancer.create(); //创建代理实例
user.eat("葡萄");
}
}

浙公网安备 33010602011771号