首页 > 代码库 > 动态代理入门(jdk)
动态代理入门(jdk)
动态代理就是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 @Override13 public void sayGoodble() {14 // TODO Auto-generated method stub15 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(); }}
动态代理入门(jdk)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。