Java 静态代理

1、介绍。

Java代理。

        java代理:在不用修改源码的情况下,可以在实现类方法的前后做些额外的处理。

  1)、静态代理。

        在程序运行前,代理类的.class文件已存在。事先知道要代理的实现类是什么。

        优点:不需要知道委托类(实现类),只需知道代理类即可。

        缺点:(1)代码重复。代理类和委托类(实现类)实现了相同的接口。
                   (2)维护复杂。接口增加一个方法,所有的代理类和委托类(实现类)都需要实现此方法,而且代理类和委托类(实现类)的关系为一对一,无法一对多。

  2)、动态代理。

        在程序运行时,通过反射机制动态生成代理类。事先不知道要代理的实现类是什么。

        优点:(1)能代理该接口的所有实现类。

                   (2)接口中的所有方法都在InvocationHandler.invoke方法中统一处理,不像静态代理那样每个都进行处理。        缺点:Java动态代理只能代理接口,要代理类需要使用如cglib第三方的类库。

 

2、代码。Proxy.java、StaticProxyInherit.java、StaticProxy.java、UserServiceImpl.java、IUserService.java、User.java。

package com.zxj.test.proxy;

import com.zxj.dao.entity.User;
import com.zxj.dao.service.impl.UserServiceImpl;

public class Proxy {
    private static void staticProxy() {
        User user = new User();
        user.setAge(11);
        user.setName("卓小杰");

        //继承委托类(实现类)的方式
        StaticProxyInherit staticProxyInherit = new StaticProxyInherit();
        staticProxyInherit.printInfo(user);

        //实现接口的方式
        StaticProxy staticProxy = new StaticProxy(new UserServiceImpl());
        staticProxy.printInfo(user);
    }

    public static void main(String[] args) {
        staticProxy();
    }
}
package com.zxj.test.proxy;

import com.zxj.dao.entity.User;
import com.zxj.dao.service.impl.UserServiceImpl;

public class StaticProxyInherit extends UserServiceImpl {
    @Override
    public void printInfo(User user) {
        System.out.println("before to do someThing");
        super.printInfo(user);
        System.out.println("after to do someThing");
    }
}
package com.zxj.test.proxy;

import com.zxj.dao.entity.User;
import com.zxj.dao.service.IUserService;
import com.zxj.dao.service.impl.UserServiceImpl;

public class StaticProxy implements IUserService {
    private UserServiceImpl userService;

    public StaticProxy(UserServiceImpl userService) {
        this.userService = userService;
    }

    @Override
    public void printInfo(User user) {
        System.out.println("before to do someThing");
        userService.printInfo(user);
        System.out.println("after to do someThing");
    }
}
package com.zxj.dao.service.impl;

import com.zxj.dao.entity.User;
import com.zxj.dao.service.IUserService;

public class UserServiceImpl implements IUserService {
    @Override
    public void printInfo(User user) {
        System.out.println(String.format("%s已经%d岁了", user.getName(), user.getAge()));
    }
}
package com.zxj.dao.service;

import com.zxj.dao.entity.User;

public interface IUserService {
    void printInfo(User user);
}
package com.zxj.dao.entity;

public class User {
    private String name;
    private int age;

    public User(){

    }

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

3、结果。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值