java中的Proxy动态代理

        本人在学习框架阶段时,意识到动态代理的重要性。它是学习java框架的基础,如果不太了解动态代理技术,那么在学习Sping框架时多多少少会有点不了解。

下面我们开始学习java的动态代理

        举个例子:

        唱、跳、rap、篮球是一位明星的技能,我们将其抽取出接口

public interface Skill {

    void sing();

    void jump();

    void rap();

    void playBasketball();

}

         那我们明星肯定是要实现这个接口的呀,他要具备这些技能,才有人粉他的嘛。每个明星还有他自己的名字,我们给他定义一个成员属性,下面是明星类定于:

public class Start implements Skill {

    private String name;

    public Start(String name) {
        this.name = name;
    }

    @Override
    public void sing() {
        System.out.println(this.name + "唱歌666");
    }

    @Override
    public void dance() {
        System.out.println(this.name + "跳舞666");
    }

    @Override
    public void rap() {
        System.out.println(this.name + "rap666");
    }

    @Override
    public void playBasketball() {
        System.out.println(this.name + "打篮球666");
    }

    
}

        假如有一天我想请这个明星来我们村里表演。好家伙,我找他肯定不行啊。别人是大明星,你想找他必须先找他的经纪人!要收钱的嘛!这个经纪人就好比明星的代理对象。

        下面我们创建一个类来获取明星类的代理对象

public class StartAgentProxy {

    /**
     * 设计一个方法来返回一个明星对象的代理对象
     */
    public static Skill getProxy(Start start) {
        //为明星生成代理对象
        return (Skill) Proxy.newProxyInstance(start.getClass().getClassLoader(), start.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("收首付款。。。");
                        //真正让明星去唱歌/跳舞/rap/打篮球
                        //method 正在被调用的方法对象 args代表这个方法的参数
                        Object rs = method.invoke(start);
                        System.out.println("收尾款。。。");
                        return rs;
                    }
                });
    }
}

        这样我们的基本代码就写完了,下面我们编写main函数进行测试

public class Test {

    public static void main(String[] args) {

        Start start = new Start("那个男人");
        Skill proxy = StartAgentProxy.getProxy(start);
        proxy.sing();
//        proxy.dance();
//        proxy.rap();
//        proxy.playBasketball();

    }

}

        输出打印:

       

第一次写博客,写的不好请多多包含! 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
需要的添加的jar包及工具:我这里使用maven来构建项目,添加依赖如下:   org.seleniumhq.selenium   selenium-java   3.2.0    PhantomJs工具到官网去下载:http://phantomjs.org/download.html 尽量都使用最新版本,不然会出现版本兼容的情况。 这里有一个已经写好的获取PhantomJSDriver的工具类 public static WebDriver getPhantomJs() {   String osname = System.getProperties().getProperty("os.name");   if (osname.equals("Linux")) {//判断系统的环境win or Linux     System.setProperty("phantomjs.binary.path", "/usr/bin/phantomjs");   } else {     System.setProperty("phantomjs.binary.path", "./phantomjs/win/phantomjs.exe");//设置PhantomJs访问路径   }   DesiredCapabilities desiredCapabilities = DesiredCapabilities.phantomjs();   //设置参数   desiredCapabilities.setCapability("phantomjs.page.settings.userAgent", "Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0");   desiredCapabilities.setCapability("phantomjs.page.customHeaders.User-Agent", "Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:50.0) Gecko/20100101   Firefox/50.0");   if (Constant.isProxy) {//是否使用代理     org.openqa.selenium.Proxy proxy = new org.openqa.selenium.Proxy();     proxy.setProxyType(org.openqa.selenium.Proxy.ProxyType.MANUAL);     proxy.setAutodetect(false);     String proxyStr = "";     do {       proxyStr = ProxyUtil.getProxy();//自定义函数,返回代理ip及端口     } while (proxyStr.length() == 0);     proxy.setHttpProxy(proxyStr);     desiredCapabilities.setCapability(CapabilityType.PROXY, proxy);   }   return new PhantomJSDriver(desiredCapabilities); } 获取方式     try{     WebDriver webDriver = PhantomJsUtil.getPhantomJs();     webDriver.get(url);     SleepUtil.sleep(Constant.SEC_5);     PhantomJsUtil.screenshot(webDriver);     WebDriverWait wait = new WebDriverWait(webDriver, 10);     wait.until(ExpectedConditions.presenceOfElementLocated(By.id(inputId)));//开始打开网页,等待输入元素出现     Document document = Jsoup.parse(webDriver.getPageSource());     //TODO  剩下页面的获取就按照Jsoup获取方式来做   }finally{     if (webDriver != null) {       webDriver.quit();     }   } python版使用webdriver+PhantomJs爬虫使用,参考http://www.cnblogs.com/kuqs/p/6395284.html

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值