Proxy.newInstance與InvocationHandler的使用示例

先定義一個接口,根據代理模式的原理,被代理類與代理類都要實現它。java

public interface Person {
    void eat();
}

再寫一個實際執行任務的類(被代理類):ide

public class RealPerson implements Person {
    @Override
    public void eat() {
        System.out.println("I am eating");
    }
}

代理類的寫法:寫一個InvocationHandler的子類this

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

public class PersonProxyHandler implements InvocationHandler {
    private Person man;

    public PersonProxyHandler(Person man) {
        this.man = man;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("before eating");
        Object res = method.invoke(man, args);
        System.out.println("after eating");
        return res;
    }

}

按照常規想法,代理類要擁有一個被代理類對象的引用,而後在invoke方法中,method.invoke(man, args); 這一句代碼代表對實際對象的調用,其他代碼就是AOP加強了。spa

主類:代理

import java.lang.reflect.Proxy;

public class Solution {

    public static void main(String[] args) {
        RealPerson man = new RealPerson();
        PersonProxyHandler realHandler = new PersonProxyHandler(man);

        Person proxy = (Person) Proxy.newProxyInstance(
                Person.class.getClassLoader(),
                new Class[]{Person.class},
                realHandler);
        proxy.eat();
    }
}

運行main方法,控制檯打印以下:code

before invoke
is eating
after invoke對象

 

這種代理方式也稱爲「JDK動態代理」blog

相關文章
相關標籤/搜索