package proxy; public interface human { public void run(); public void eat(); }
定义接口
以接口完成类的定义
package proxy; public class teacher implements human{ @Override public void run() { // TODO Auto-generated method stub System.out.println("走"); } @Override public void eat() { // TODO Auto-generated method stub System.out.println("吃"); } }
完成主函数的定义
package proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import org.junit.Test; public class demo { public static void main(String[] args) { teacher teacher1 = new teacher(); human teacher2 = (human) Proxy.newProxyInstance(teacher.class.getClassLoader(),teacher.class.getInterfaces() , new InvocationHandler() { /*invoke代表的执行代理对象的方法 method 对象的方法 args 对象响应的参数*/ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("之前做一些事"); if(method.getName().equals("eat")) { /*判断方法*/ System.out.println("吃之前跑下步"); } //执行目标对象的方法 Object invokea = method.invoke(new teacher(), args); System.out.println("之后做一些事"); // TODO Auto-generated method stub return invokea; } }); teacher1.eat(); teacher1.run(); System.out.println("老师1完成"); teacher2.eat(); teacher1.run(); } }
结果
吃
走
老师1完成
之前做一些事
吃之前跑下步
吃
之后做一些事
走
动态代理
可以在运行的时候才切入改变类的方法,而不需要预先定义它。