jdk和cglib代理


公共类

接口
Student

package com.example.demo.test.proxy;

public interface Student {

    String eat();

    String see();
}

实现类
StudentImpl

package com.example.demo.test.proxy;

import lombok.extern.slf4j.Slf4j;

/**
 * 

* *

* * @author: GoslingWu * @date: 2022-03-08 */ @Slf4j public class StudentImpl implements Student{ @Override public String eat() { String str = "我吃了一口??!"; log.info(str); return str; } @Override public String see() { String str = "卧槽 海盗??!"; log.info(str); return str; } }

JDK代理

JDKProxyFactory

package com.example.demo.test.proxy.jdk;

import com.example.demo.test.proxy.Student;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 

* *

* * @author: GoslingWu * @date: 2022-03-08 */ @Slf4j @Data @AllArgsConstructor @NoArgsConstructor public class JDKProxyFactory implements InvocationHandler { private Object target; public Student createProxy(){ Student s = (Student) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); return s; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { before(); Object invoke = method.invoke(target, args); after(); return invoke; } private void before() { log.info("开始暗箱操作了!"); } private void after() { log.info("干净又卫生,兄弟们!"); } }

cglib代理

CglibProxyFactory

package com.example.demo.test.proxy.cglib;

import com.example.demo.test.proxy.Student;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * 

* *

* * @author: GoslingWu * @date: 2022-03-08 */ @Slf4j @Data @NoArgsConstructor @AllArgsConstructor public class CglibProxyFactory implements MethodInterceptor { private Object target; public Student createProxy(){ //1.创建Enhancer Enhancer enhancer = new Enhancer(); //2.传递目标对象的class enhancer.setSuperclass(target.getClass()); //3.设置回调操作 enhancer.setCallback(this); return (Student) enhancer.create(); } @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { before(); Object invoke = methodProxy.invoke(target, objects); after(); return invoke; } private void before() { log.info("那是个啥玩意,走近看看。。"); } private void after() { log.info("走开。。。"); } }