课程咨询 :186 8716 1620      qq:2066486918

昆明Java培训 > 达内新闻 > Java培训班:JDK动态代理
  • Java培训班:JDK动态代理

    发布:昆明Java培训      来源:达内新闻      时间:2016-10-21

  • 昆明Java培训班的老师发现,此时代理对象和目标对象实现了相同的接口,目标对象作为代理对象的一个属性,具体接口实现中,可以在调用目标对象相应方法前后加上其他业务处理逻辑。

    代理模式在实际使用时需要指定具体的目标对象,如果为每个类都添加一个代理类的话,会导致类很多,同时如果不知道具体类的话,怎样实现代理模式呢?这就引出动态代理。

    JDK动态代理只能针对实现了接口的类生成代理。

    看看代码:

    dao实现类

    public class UserDaoImpl implements UserDao {

    public void add() {

    System.out.println("add success");

    }

    }

    ProxySubject

    public class ProxySubject implements Subject {

    private Subject realSubject;

    public String request() {

    System.out.println("代理增强");

    return realSubject.request();

    }

    public Subject getRealSubject() {

    return realSubject;

    }

    public void setRealSubject(Subject realSubject) {

    this.realSubject = realSubject;

    }

    public class RealSubject implements Subject {

    public String request() {

    // TODO Auto-generated method stub

    return "真实主题";

    }

    }

    */

    public interface Subject {

    public String request();

    }

    test

    public static void main(String[] args) {

    /**

    *静态代理

    */

    /*Subject sub=new RealSubject();//被代理对象

    System.out.println(sub.toString());

    ProxySubject ps=new ProxySubject();//代理对象

    System.out.println(ps.toString());

    ps.setRealSubject(sub);

    String request = ps.request();//走真实代理对象 RealSubject

    System.out.println(request);*/

    /**

    *动态代理

    */

    final UserDao dao=new UserDaoImpl();

    //代理对象

    //第一个参数:获取和dao一样的类加载器,通过反射机制获取类加载器

    //new InvocationHandler()叫匿名内部类,拿到了接口的实现类

    UserDao newProxyInstance = (UserDao) Proxy.newProxyInstance(dao.getClass().getClassLoader(), dao.getClass().getInterfaces(), new InvocationHandler() {

    //newProxyInstance被代理对象

    public Object invoke(Object ewProxyInstance, Method method, Object[] args)

    throws Throwable {

    System.out.println("增强");

    //原始对象 dao    真正的dao   

    Object invoke = method.invoke(dao, args);

    System.out.println("记录日志");

    return invoke;

    }

    });

    //增强代理对象,方法

    newProxyInstance.add();

    }

    对代码的剖析:

    Proxy

    InvocationHandler

    实现了invoke()

    Method

    applicationContext.xml

    <bean id="service" class="cn.wgy.day01.service.UserService"></bean>

    <bean id="error" class="cn.wgy.day01.aop.ErrorLog"/>

    <aop:config>

    <aop:pointcut expression="execution(public void delete())" id="pointcut"/>

    <!--异常抛出增强-->

    <aop:advisor advice-ref="error" pointcut-ref="pointcut"/>

    </aop:config>

    </beans>

    了解详情请登陆昆明达内Java培训官网(km.Java.tedu.cn)!

    推荐文章

上一篇:java程序员:代理模式的定义

下一篇:Java培训:CGLIB代理

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:12/29

Java--零基础业余班

Java--零基础业余班

开班日期:12/29

Java--周末提升班

Java--周末提升班

开班日期:12/29

Java--零基础周末班

Java--零基础周末班

开班日期:12/29

  • 网址:http://km .java.tedu.cn      地址:昆明市官渡区春城路62号证券大厦附楼6楼
  • 课程培训电话:186 8716 1620      qq:2066486918    全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56