Java动态代理

技术文档网 2021-04-15

Jdk动态代理

通过InvocationHandler和Proxy针对实现了接口的类进行动态代理,即必须有相应的接口

应用

public class TestProxy {
    public static void main(String[] args) {
        CTest cTest=new CTest();
        MyInvokationHandler handler=new MyInvokationHandler();
        handler.setTarget(cTest);
        ITest test = (ITest)Proxy.newProxyInstance(cTest.getClass().getClassLoader(), cTest.getClass().getInterfaces(), handler);
        test.say();
        test.sayHi("bill");
    }
}

接口及实现类

//接口
public interface ITest {
    public void say();
    public void sayHi(String name);
}

//实现类
public class CTest implements ITest{
    public void say() {
        System.out.println("just say ...");
    }

    public void sayHi(String name) {
        System.out.println("just say to " + name);

    }
}

反射处理器

public class MyInvokationHandler implements InvocationHandler{
    private Object target;

    public void setTarget(Object target) {
        this.target = target;
    }
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("starting call " + method);
        method.invoke(target, args);
        System.out.println("ending call " + method);
        return null;
    }
}

Cglib动态代理

cglib动态代理是通过Enhancer创建代理类的子类,并重写相应的方法加入方法拦截器后再调用父类即代理类的方法

应用

/**
 * 通过Enhancer创建代理类的子类,并重写相应的方法加入方法拦截器后再调用父类即代理类的方法
 * Created by bing on 2016/12/30.
 */
public class MyApp {

    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(MyService.class);
        enhancer.setCallback(new MyMethodInterceptor());
        MyService service = (MyService)enhancer.create();
        service.add();
        service.delete();
    }
}

定义方法拦截器

/**
 * 定义方法拦截器
 * Created by bing on 2016/12/30.
 */
public class MyMethodInterceptor implements MethodInterceptor{
    @Override
    public Object intercept(Object target, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        System.out.println("before: " + method);
        Object object = methodProxy.invokeSuper(target, args);
        System.out.println("after: " + method);
        return object;
    }
}

业务逻辑实现类

/**
 * 业务逻辑实现类
 * Created by bing on 2016/12/30.
 */
public class MyService {

    public void add(){
        System.out.println("test service add method ..");
    }

    public void delete(){
        System.out.println("test service delete method ..");
    }
}

相关文章

  1. 基于-SLF4J-MDC-机制的日志链路追踪配置属性

    ums: # ================ 基于 SLF4J MDC 机制的日志链路追踪配置属性 ================ mdc: # 是否支持基于 SLF4J MDC

  2. ajax-跨域访问

    ajax 跨域访问 <!DOCTYPE html> <html xmlns:th="http://www.w3.org/1999/xhtml"> <head>

  3. 给第三方登录时用的数据库表-user_connection-与-auth_token-添加-redis-cache

    spring: # 设置缓存为 Redis cache: type: redis # redis redis: host: 192.168.88.88 port

  4. Java动态代理

    Jdk动态代理 通过InvocationHandler和Proxy针对实现了接口的类进行动态代理,即必须有相应的接口 应用 public class TestProxy { public

  5. Java读取classpath中的文件

    public void init() { try { //URL url = Thread.currentThread().getContextClassLo

随机推荐

  1. 基于-SLF4J-MDC-机制的日志链路追踪配置属性

    ums: # ================ 基于 SLF4J MDC 机制的日志链路追踪配置属性 ================ mdc: # 是否支持基于 SLF4J MDC

  2. ajax-跨域访问

    ajax 跨域访问 <!DOCTYPE html> <html xmlns:th="http://www.w3.org/1999/xhtml"> <head>

  3. 给第三方登录时用的数据库表-user_connection-与-auth_token-添加-redis-cache

    spring: # 设置缓存为 Redis cache: type: redis # redis redis: host: 192.168.88.88 port

  4. Java动态代理

    Jdk动态代理 通过InvocationHandler和Proxy针对实现了接口的类进行动态代理,即必须有相应的接口 应用 public class TestProxy { public

  5. Java读取classpath中的文件

    public void init() { try { //URL url = Thread.currentThread().getContextClassLo