动态代理就是aop的核心,动态代理简单的就是通过创建一个代理对象,然后把原来的方法增强。很抽象,例子是王道。jdk中提供了动态代理的实现,但是它是针对接口,如果要实现动态代理,需要被代理对象的接口。这是它的缺点,不能为了实现动态代理,都要给被代理对象写个接口,在web开发中有时很麻烦,这样就出现了通过直接改变字节码,写个子类重写需要增强的方法,但是如果这个类中的方法定义为final,它也没办法了。
1.委托类需要实现的接口
1 package 动态代理; 2 3 public interface heelo { 4 String sayHello(); 5 void sayGoodble(); 6 7 }
2、委托类的具体实现
1 package 动态代理; 2 3 public class HelloImpl implements heelo{ 4 5 @Override 6 public String sayHello() { 7 // TODO Auto-generated method stub 8 return "heelo"; 9 10 } 11 12 @Override 13 public void sayGoodble() { 14 // TODO Auto-generated method stub 15 System.out.println("goodBye"); 16 17 } 18 19 }
3.handler(advice)
package 动态代理; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class HelloHander implements InvocationHandler{ HelloImpl hip=null; //传入被代理的对象 public HelloHander(HelloImpl hip) { this.hip=hip; } @Override // public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable { // TODO Auto-generated method stub System.out.println("before "+arg1.getName()); Object res=arg1.invoke(hip, arg2);//被代理的对象原来的逻辑 System.out.println("after "+arg1.getName()); return res; //此处请注意啊,执行顺序。 } }
4.客户端
package 动态代理; import java.lang.reflect.Proxy; public class Test { public static void main(String[] args) { // TODO Auto-generated method stub HelloImpl hl=new HelloImpl();//target,被代理的对象 HelloHander hh=new HelloHander(hl);//创建一个处理器,类似advice //创建一个代理对象,为target的所有方法进行代理 heelo h=(heelo) Proxy.newProxyInstance(hl.getClass().getClassLoader(), hl.getClass().getInterfaces(), hh); //调用sayHeelo方法 System.out.println(h.sayHello()); System.out.println(); //调用sayBye h.sayGoodble(); } }
时间: 2024-10-10 02:01:36