先定義一個接口,根據代理模式的原理,被代理類與代理類都要實現它。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