从下面几个问题来了解JDK动态代理:
一、什么是代理模式?
定义:为其他对象提供一种代理以控制这个对象的访问,在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在调用端和目标对象之间起到中介的作用。
组成元素:接口,代理类,接口的实现类。
二、一个简单的例子
一个接口IUserDao
package com.hw.proxy;
/**
* Created by hw on 2018/3/22 0022.
*/
public interface IUserDao {
public void save(String str);
}
一个实现类UserDaoImpl实现IUserDao
package com.hw.proxy;
/**
* Created by Administrator on 2018/3/22 0022.
*/
public class UserDaoImpl implements IUserDao{
@Override
public void save(String str) {
System.out.println("人员保存");
}
}
一个代理类
package com.hw.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* Created by hw on 2018/3/22 0022.
*/
public class ProxyFactory {
//
private Object target;
public ProxyFactory(Object target) {
this.target = target;
}
public Object getProxyInstance(){
ClassLoader cl = target.getClass().getClassLoader();
Class<?>[] interfaces = target.getClass().getInterfaces();
InvocationHandler invocationHandler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("1");
Object obj = method.invoke(target,args);
System.out.println("2");
return obj;
}
};
return Proxy.newProxyInstance(cl,interfaces,invocationHandler);
}
}
一个测试类
package com.hw.proxy;
import org.junit.Test;
/**
* Created by hw on 2018/3/22 0022.
*/
public class ProxyTest {
@Test
public void test() {
IUserDao target = new UserDaoImpl();
IUserDao proxyTarget = (IUserDao) new ProxyFactory(target).getProxyInstance();
proxyTarget.save("13");
}
}
输出结果:
1
人员保存
2
有几个疑问:代理对象什么时候生成的?InvocationHandler在里面起什么作用?invoke方法什么时候调用的?
下一篇通过源码来解答这几个问题