静态代理

public interface Subject {

    public void Rread();
}
public class ReadSubject implements Subject{
    //这里是单例用法,这个类主要是为了给ResultSubject提供Subject实例
    static ReadSubject rs=new ReadSubject();
    private ReadSubject(){

    }
    public static ReadSubject getReadSubject(){
        return rs;
    }
    public static Subject getSubject(){
        return new ReadSubject();
    }

    @Override
    public void Rread() {
        System.out.println("生成方法的中间类");
    }
}
public class StaticProxy implements Subject{
    //这个静态代理类用来重写接口Subject的Rread方法
    private Subject rs=null;
    //这个是构造函数为了使需要重写类与该类建立联系,达到重写Rread的目的
    //具体是new StaticProxy(rs.getSubject())
    public StaticProxy(Subject rs){
        this.rs=rs;

    }
    @Override
    public void Rread() {
        System.out.println("hello world");
    }

}
public class ResultSubject{
    ReadSubject rs=ReadSubject.getReadSubject();
    public  Subject s=null;
    public ResultSubject(){
        s=rs.getSubject();//这样将不会重写Subject的Rread方法

    }
}
public class ResultSubject{
    ReadSubject rs=ReadSubject.getReadSubject();
    public  Subject s=null;
    public ResultSubject(){
        //这样利用静态代理可以达到重写的目的
        s=new StaticProxy(rs.getSubject());

    }
}
public class Test {
    public static void main(String[] args) {
//        Subject subject=new StaticProxy(new ResultSubject());
//        subject.Rread();
        ResultSubject rs=new ResultSubject();     Subject s=rs.s;
         s.Rread();
    }
}
运行结果是hello world

可见我们确实重写了Subject接口的Rread方法

这里主要是在StaticProxy类中我们加入了Subject接口实例赋值,在ResultSubject类中我们利用StaticProxy类来引入Subject接口实例实例,所以从ResultSubject类 中得到的Subject接口实例都经过StaticProxy类   从而重写了Rread方法

这里主要是为了解决例如:在连接数据库时,自己写DAO时   只能利用DriverManager.getConnection来获得Connection接口实例,又想在接下来的操作中重写close时会用到。

时间: 2024-10-14 23:42:40

静态代理的相关文章

Spring框架_代理模式(静态代理,动态代理,cglib代理)

共性问题: 1. 服务器启动报错,什么原因? * jar包缺少.jar包冲突 1) 先检查项目中是否缺少jar包引用 2) 服务器: 检查jar包有没有发布到服务器下:                                      用户库jar包,需要手动发布到tomcat. (每次新建项目) 3) 重新发布项目 * 配置文件错误 (web.xml / struts.xml /bean.xml /hibernate.xml / *.hbm.xml) 明确的提示 * 端口占用 * we

SpringAop_静态代理模式

package com.spring.proxy; public interface PersonDao { public void savePerson(); } package com.spring.proxy; public class PersonDaoImpl implements PersonDao { @Override public void savePerson() { System.out.println("save person"); } } package co

静态代理和动态代理

所谓的代理设计就是指由一个代理主题来操作真实主题,真实主题运行详细的业务操作.而代理主题负责其它相关业务的处理. 系统中常常有这样的需求:在某些操作前须要进行验证操作,比方:在加入/删除操作时,先进性用户信息验证,确认该用户是否拥有这些操作的权限.代码例如以下: //UserManager接口: public interface UserManager { public void addUser(String username, String password); public void del

静态代理与动态代理

记得刚接触代理,是在大话设计模式,最近在技术总结和学些java的过程又接触到静态代理和动态代理,尤其是动态代理,在学习AOP时,用到了动态代理,下面我用一些例子来对静态代理和动态代理做个总结. 其实用了代理之后最大的好处就是隐藏了真实类(委托类),这样更加安全,而静态代理和动态代理最大的区别就是,静态代理的代理类是程序员自己写的,在程序运行之前就已经存在的,而动态代理则是在程序运行时动态生成的,而且因为动态代理更加灵活,也常被应用. 首先先用一张UML图来理解一下代理是怎么回事? 其实静态代理就

深入浅出java静态代理和动态代理

首先介绍一下,什么是代理: 代理模式,是常用的设计模式.特征是,代理类与委托类有相同的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类.以及事后处理消息. 代理类和委托类,存在着关联关系.代理类的对象本身并不真正实现服务,知识通过调用委托类的对象的相关方法. 代理类可以分为两种:静态代理和动态代理. 静态代理: 代理类是由程序员创建,或由工具生成的代码 编译成的.在程序运行前,代理类的 *.class文件已经存在了.直接就可以运行 . 动态代理: 动态代理的代理类.没有直接由

静态代理$动态代理

什么是静态代理? 静态代理就是代理模式,给真实类做了个增强的方法 比如你有个房源,你还有代理人那么这个代理人就会给你的怎是房源的基础上,夸大点让你的房源增加人脉... 就要用到增强方法,就在代理类中给你的方法增强 //静态代理模式public class Progects {/* @Test public void dd() {//真实代理 Subject jk=new Real(); //代理对象 Proxy hj=new Proxy(); //调度代理对象(jk)方法增强 hj.setSub

spring静态代理和动态代理

本节要点: Java静态代理 Jdk动态代理 1 面向对象设计思想遇到的问题 在传统OOP编程里以对象为核心,并通过对象之间的协作来形成一个完整的软件功能,由于对象可以继承,因此我们可以把具有相同功能或相同特征的属性抽象到一个层次分明的类结构体系中.随着软件规范的不断扩大,专业化分工越来越系列,以及OOP应用实践的不断增多,随之也暴露了一些OOP无法很好解决的问题. 现在假设系统中有三段完全相似的代码,这些代码通常会采用"复制"."粘贴"方式来完成,通过这种方式开发

Atitit 代理CGLIB 动态代理 AspectJ静态代理区别

Atitit 代理CGLIB 动态代理 AspectJ静态代理区别 1.1. AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表:而动态代理则以 spring AOP 为代表 1 1.2. JDK动态代理是模拟接口实现的方式,cglib是模拟子类继承的方式1 1.3. CGLIB代理模式的缺点 在static和final方法上应用横切关注点也是无法做到的.2 1.1. AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表:而动态代理则以 

静态代理与动态代理的简单使用

代理模式(Proxy Pattern)是一种比较常见的设计模式,在很多场合都会被用到. 所谓代理指的是让其他的类代替完成一些任务(执行一些方法等),在软件开发中代理模式具有非常重要的作用,面向切面编程(AOP)便是基于代理模式运作的编程范式. 下面介绍一下其中的静态代理与动态代理,基于Java语言. 静态代理: 首先由一个HelloWorld接口,其中有一个方法,print public interface HelloWorld { void print(); } 接下来是实现了HelloWor