03-动态代理复习增强

Posted jepson6669

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了03-动态代理复习增强相关的知识,希望对你有一定的参考价值。

1 接口

package www.test.service;

public interface UserService {

    public abstract void add();
    public abstract void delete();
    public abstract void update();
    public abstract void find();
}

2 实现接口类的代码

package www.test.service;

public class UserServiceImpl implements UserService {
    @Override
    //添加用户
    public void add() {
        System.out.println("添加用户");
    }
    @Override
    //删除用户
    public void delete() {
        System.out.println("删除用户");
    }
    @Override
    //修改用户
    public void update() {
        System.out.println("修改用户");
    }
    @Override
    //查找用户
    public void find() {
        System.out.println("查找用户");
    }
}

3 获取动态代理工厂-1

package www.test.c_proxy;

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

import www.test.service.UserService;
import www.test.service.UserServiceImpl;

//1 创建一个类实现InvocationHandler
public class UserServiceProxyFactory1 implements InvocationHandler {
    

    private UserService us;
    

    public UserServiceProxyFactory1(UserService us) {
        this.us = us;
    }

    //获得动态的代理对象----在运行时 在内存中动态的为 UserServiceImpl 创建一个虚拟的代理对象
    public UserService getUserServiceProxy(){
        //生成动态代理
        UserService usProxy = (UserService)Proxy.newProxyInstance( 
                UserServiceProxyFactory1.class.getClassLoader(),
                UserServiceImpl.class.getInterfaces(),
                this);
        return usProxy;
    }
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("目标方法前的逻辑");
        Object invoke = method.invoke(us, args);
        System.out.println("目标方法前的逻辑");
        return invoke;
    }
}

3 获取动态代理工厂-2

package www.test.c_proxy;

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

import www.test.service.UserService;
import www.test.service.UserServiceImpl;

public class UserServiceProxyFactory2 {

    private UserService us;
    public UserServiceProxyFactory2(UserService us) {
        this.us = us;
    }
    //获得动态的代理对象----在运行时 在内存中动态的为 UserServiceImpl 创建一个虚拟的代理对象
    public UserService getUserServiceProxy(){
        
        UserService usProxy = (UserService) Proxy.newProxyInstance(
                //loader :与目标对象相同的类加载器
                UserServiceProxyFactory2.class.getClassLoader(),
                // interfaces :代表与目标对象实现的所有接口字节码对象数组
                UserServiceImpl.class.getInterfaces(),
                //h: 具体的操作,InvocationHandler接口
                 new InvocationHandler() {
                    //invoke 代表的是执行代理对象的方法
                    //method: 代表目标对象的方法字节码对象
                    //args:代表目标对象的相应的方法的参数
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("目标方法前的逻辑");
                        //执行目标方法
                        Object invoke = method.invoke(us, args);
                        System.out.println("目标方法后的逻辑");
                        return invoke;
                    }
                });
        return usProxy;
    }
}

4 获取动态代理工厂-3(简洁)

package www.test.c_proxy;

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

import www.test.service.UserService;
import www.test.service.UserServiceImpl;

public class UserServiceProxyFactory3 {

    private UserService us;
    public UserServiceProxyFactory3(UserService us) {
        this.us = us;
    }
    //获得代理对象
    public UserService getUserServiceProxy(){
        
        UserService usProxy = (UserService) Proxy.newProxyInstance(
                UserServiceProxyFactory3.class.getClassLoader(),
                UserServiceImpl.class.getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("目标方法前的逻辑");
                        //执行目标方法
                        Object invoke = method.invoke(us, args);
                        System.out.println("目标方法后的逻辑");
                        return invoke;
                    }
                });
        return usProxy;
    }
}

5 测试

1 UserServiceProxyFactory1 测试

package www.test.c_proxy;

import org.junit.Test;

import www.test.service.UserService;
import www.test.service.UserServiceImpl;

public class Demo {

    @Test
    //动态代理
    public void fun1(){
        UserService us = new UserServiceImpl();
        UserServiceProxyFactory1 proxyFactory = new UserServiceProxyFactory1(us);
        UserService usProxy = proxyFactory.getUserServiceProxy();
        
        usProxy.add();
        
        //代理对象与被代理对象实现了相同的接口
        //代理对象与被代理对象没有继承关系
        System.out.println(usProxy instanceof UserServiceImpl); //false
    }
}

2 UserServiceProxyFactory2 测试

 

package www.test.c_proxy;

import org.junit.Test;

import www.test.service.UserService;
import www.test.service.UserServiceImpl;

public class Demo2 {

    @Test
    public void fun1(){
        UserService us = new UserServiceImpl();
        UserServiceProxyFactory2 proxyFactory = new UserServiceProxyFactory2(us);
        UserService usProxy = proxyFactory.getUserServiceProxy();
        usProxy.delete();
        
        //代理对象与被代理对象实现了相同的接口
        //代理对象与被代理对象没有继承关系
        System.out.println(usProxy instanceof UserServiceImpl);//false;
    }
}

 

以上是关于03-动态代理复习增强的主要内容,如果未能解决你的问题,请参考以下文章

JDK动态代理

03动态代理--JDK动态代理和CGLib动态代理的组合实例

Java学习之动态代理

动态SQL基础概念复习(Javaweb作业5)

spring03-aop

jdk动态代理源码分析