Java 動態代理

Java動態代理的實現有兩種方式:

1、jdk 自帶的動態代理

2、spring 中的cglib實現的動態代理

區別:

jdk自帶的動態代理一定要有接口interface類,而cglib不需要。

(1)基本信息

UserInfoService.java 類:

public interface UserInfoService {   
    String getUserName(String userName);
}
UserInfoServiceImpl類:
public class UserInfoServiceImpl implements UserInfoService{
    
    @Override
    public String getUserName(String userName) {
        return userName;
    }
}

(2)jdk 自帶的動態代理

UserInfoServiceImplJdk.java

public class UserInfoServiceImpJdk implements InvocationHandler {
    
    private Object target;
    
    public Object bind(Object target) {
        this.target = target;
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = null;

        System.out.println("jdk proxy before ...");
        result = method.invoke(target, args);
        System.out.println("jdk proxy after ...");
        
        return result;
    }

    public static void main(String[] args) {
        UserInfoServiceImpl userInfoServiceImpl = new UserInfoServiceImpl();
        UserInfoServiceImpJdk userInfoServiceImpJdk = new UserInfoServiceImpJdk();
        UserInfoServiceImpl userInfoServiceImp2 = (UserInfoServiceImpl) userInfoServiceImpJdk.bind(userInfoServiceImpl);
        String result = userInfoServiceImp2.getUserName("tim");
        System.out.println(result);
    }
}

(3) Spring cglib實現的動態代理

public class UserInfoServiceImplCglib implements MethodInterceptor {
    
    private Object target;
    
    public Object getInstance(Object target) {
        this.target = target;
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(this.target.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }
    
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("before cglib ....");
        Object object = methodProxy.invokeSuper(o, objects);
        System.out.println("after");
        return object;
    }

    public static void main(String[] args) {
        UserInfoServiceImpl userInfoService = new UserInfoServiceImpl();
        UserInfoServiceImplCglib userInfoServiceImplCglib = new UserInfoServiceImplCglib();
        UserInfoServiceImpl userInfoService1 = (UserInfoServiceImpl)userInfoServiceImplCglib.getInstance(userInfoService);
        String result = userInfoService1.getUserName("tim");
        System.out.println(result);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章