动态代理模式主要由四个元素共同构成:
1. 接口,接口中的方法是要真正去实现的
2. 被代理类,实现上述接口,这是真正去执行接口中方法的类
3. 代理类,实现InvocationHandler,帮助被代理类去实现方法
4. 测试用例:
代码示例
- 接口:
public interface Person {
void searchHouse();
}
- 被代理类Master,实现上述接口:
public class Master implements Person {
void searchHouse(){
System.out.println("I'm Mater.");
};
}
- 代理类HomeLine,实现InvocationHandler接口
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class HomeLink implements InvocationHandler{
private Person target;
public Object getInstance(Person target){
this.target = target;
Class clazz = target.getClass();
return Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this);
}
@Override
public Object invoke(Object obj, Method method, Object[] args) throws Throwable {
System.out.println("HomeLink Start...");
//第一个参数是target,也就是被代理类的对象;第二个参数是方法中的参数
method.invoke(target, args);
System.out.println("HomeLink End...");
return null;
}
}
4.测试用例:
public class TestSearchHouse {
public static void main(String[] args) {
Person person = (Person) new HomeLink().getInstance(new Master());
person.searchHouse();
}
}
- 运行结果如下:
HomeLink Start…
I’m Mater.
HomeLink End…
使用
通过动态代理,可以拦截到未知类的方法调用。