1. 程式人生 > >Java中動態代理方式:

Java中動態代理方式:

tint lap cto getname AI clas tcl show this

JDK中生成代理對象的API

代理類所在包:java.lang.reflect.Proxy
JDK實現代理只需要使用newProxyInstance方法,但是該方法需要接收三個參數,完整的寫法是:

static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h )

註意該方法是在Proxy類中是靜態方法,且接收的三個參數依次為:

  • ClassLoader loader,:指定當前目標對象使用類加載器,獲取加載器的方法是固定的
  • Class<?>[] interfaces,
    :目標對象實現的接口的類型,使用泛型方式確認類型
  • InvocationHandler h:事件處理,執行目標對象的方法時,會觸發事件處理器的方法,會把當前執行目標對象的方法作為參數傳入

Member.java實體類:

技術分享圖片
package com.dx.dynamicproxy;

public class Member {
    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int
id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Member(int id, String name) { super(); this.id = id; this.name = name; } @Override
public String toString() { return "Member [id=" + id + ", name=" + name + "]"; } }
View Code

IMemberService.java

package com.dx.dynamicproxy;

public interface IMemberService {
    public String create(Member member);
}

MemberSerivceImpl.java

package com.dx.dynamicproxy;

public class MemberSerivceImpl implements IMemberService {
    public String create(Member member) {
        System.out.println("create member:" + member);
        return "SUCCESS";
    }
}

MemberServiceImplProxy.java動態代理類

package com.dx.dynamicproxy;

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

public class MemberServiceImplProxy implements InvocationHandler {
    private Object obj;

    public MemberServiceImplProxy(Object obj) {
        this.obj = obj;
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        before(method);

        Object resultValue = method.invoke(obj, args);// 真實的調用方法操作

        after(method);

        return resultValue;
    }

    private void before(Method method) {
        System.out.println("before " + method);
    }

    private void after(Method method) {
        System.out.println("after " + method);
    }
}

ProxyFactory.java 動態代理工廠(更通用)

package com.dx.dynamicproxy;

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

/**
 * 創建動態代理對象 動態代理不需要實現接口,但是需要指定接口類型
 */
public class ProxyFactory {
    // 維護一個目標對象
    private Object target;

    public ProxyFactory(Object target) {
        this.target = target;
    }

    /**
     * 給目標對象生成代理對象
     */
    public Object getProxyInstance() {
        ClassLoader classLoader = target.getClass().getClassLoader();
        Class<?>[] interfaces = target.getClass().getInterfaces();

        InvocationHandler invocationHandler = new InvocationHandler() {
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                before(method);
                // 執行目標對象方法
                Object returnValue = method.invoke(target, args);
                after(method);

                return returnValue;
            }
        };

        return Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
    }

    private void before(Method method) {
        System.out.println("before " + method);
    }

    private void after(Method method) {
        System.out.println("after " + method);
    }
}

Client.java 調用示例:

package com.dx.dynamicproxy;

public class Client {
    public static void main(String[] args) {
        IMemberService baseMemberService = new MemberSerivceImpl();
        
//        InvocationHandler handler = new MemberServiceImplProxy(baseMemberService);
//        Class<?> classType = handler.getClass();
//        IMemberService memberService = (IMemberService) Proxy.newProxyInstance(classType.getClassLoader(),
//                baseMemberService.getClass().getInterfaces(), handler);
        // 或者
        IMemberService memberService = (IMemberService) new ProxyFactory(baseMemberService).getProxyInstance();

        Member member = new Member(1, "test");
        // 執行invoke方法
        String result = memberService.create(member);

        System.out.println(result);
    }
}

Java中動態代理方式: