动态代理
动态代理
代理模式:
使用一个代理将对象包装起来,然后使用这个代理对象取代原始对象,任何对原始对象的操作都要通过代理,代理对象·决定是否以及何时将方法调用转到原始对象上。
public class ProxyTest {
public static void main(String[] args){
Interface test=new ProxyInterface(new RealInterface());
test.test();
}
}
interface Interface{
public void test();
}
class RealInterface implements Interface{
@Override
public void test() {
System.out.println("我是真正的类");
}
}
class ProxyInterface implements Interface{
private Interface anInterface;
public ProxyInterface(Interface anInterface) {
this.anInterface = anInterface;
}
private void check(){
System.out.println("代理类的一些检查工作");
}
@Override
public void test() {
check();
anInterface.test();
System.out.println("我是代理类");
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyTest {
public static void main(String[] args){
RealInterface realInterface=new RealInterface();
Interface test=(Interface) ProxyFactory.getProxyInstance(realInterface);
//只能执行接口中含有的方法。
//test.getAge();
test.test();
}
}
interface Interface{
public void test();
}
class RealInterface implements Interface{
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public void test() {
System.out.println("我是真正的类");
}
}
class ProxyFactory{
public static Object getProxyInstance(Object object){
MyInvocationHandler myInvocationHandler=new MyInvocationHandler();
myInvocationHandler.bind(object);
return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),myInvocationHandler);
}
}
class MyInvocationHandler implements InvocationHandler{
private Object object;
public void bind(Object object){
this.object=object;
}
//此处的proxy其实就是生成的代理类
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(object,args);
}
}
浙公网安备 33010602011771号