静态代理
基于实现接口的静态代理
public interface ICar {
void run();
}
public class Car implements ICar{
@Override
public void run() {
System.out.println("汽车跑");
}
}
public class CarProxy implements ICar{
private ICar car;
public CarProxy(ICar car) {
this.car = car;
}
@Override
public void run() {
System.out.println("方法开始");
car.run();
System.out.println("方法结束");
}
}
public class StaticProxyDemo1 {
public static void main(String[] args) {
Car car = new Car();
CarProxy carProxy = new CarProxy(car);
carProxy.run();
}
}
方法开始
汽车跑
方法结束
基于继承的静态代理
public class Person {
public void sleep(){
System.out.println("人睡觉");
}
}
public class PersonProxy extends Person{
@Override
public void sleep() {
System.out.println("方法开始");
super.sleep();
System.out.println("方法结束");
}
}
public class StaticProxyDemo2 {
public static void main(String[] args) {
Person person = new PersonProxy();
person.sleep();
}
}
方法开始
人睡觉
方法结束
动态代理
jdk动态代理(基于实现接口)
public interface IUserService {
void addUser();
}
public class UserService implements IUserService{
@Override
public void addUser() {
System.out.println("添加用户");
}
}
public class UserProxy implements InvocationHandler {
private Object target;
public UserProxy(Object target){
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("方法开始");
Object res = method.invoke(target, args);
System.out.println("方法结束");
return res;
}
}
/**
* jdk动态代理
*/
public class DynamicProxyDemo1 {
public static void main(String[] args) {
UserService userService = new UserService();
IUserService iUserService = (IUserService) Proxy.newProxyInstance(userService.getClass().getClassLoader(), userService.getClass().getInterfaces(),new UserProxy(userService));
iUserService.addUser();
}
}
方法开始
添加用户
方法结束
cglib动态代理(基于继承)
public class Target {
public void targetInfo(){
System.out.println("目标类信息");
}
}
public class MyInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("方法开始");
Object res = methodProxy.invokeSuper(o,objects);
System.out.println("方法结束");
return res;
}
}
/**
* cglib动态代理
*/
public class DynamicProxyDemo2 {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(Target.class);
enhancer.setCallback(new MyInterceptor());
//创建子类,即代理类
Target proxyTarget = (Target) enhancer.create();
proxyTarget.targetInfo();
}
}
方法开始
目标类信息
方法结束