动态代理demo

162 阅读1分钟

静态代理

package com.staticProxy;

public interface Person {
    public void eat();
}

package com.staticProxy;

public class Teacher implements Person{
    @Override
    public void eat(){

        System.out.println("老师也爱吃东西");
    }
}

package com.staticProxy;

public class staticProxy implements Person{
    private Teacher teacher;

    public  staticProxy(Teacher teacher){

        this.teacher = teacher;
    }


    @Override
    public void eat() {
        System.out.println("代理模式");
        teacher.eat();
    }
}

package com.staticProxy;


public class test {
    public static void main(String[] args) {
        Teacher teacher = new Teacher();
        staticProxy staticProxy = new staticProxy(teacher);
        staticProxy.eat();
    }
}

动态代理需要反射完成,借鉴AOP思想

package com.dynamicProxy;

public interface Phone {
    public String salePhone();
}

package com.dynamicProxy;

public class Apple implements Phone {
    @Override
    public String salePhone() {
        return "销售iPhone手机";
    }
}

package com.dynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class MyInvocationHandler implements InvocationHandler {

    private Object target;

    //1、传入委托对象 2、返回代理对象
    public Object bind(Object object){
        //保存委托对象
        this.target = object;

        return Proxy.newProxyInstance(
                MyInvocationHandler.class.getClassLoader(),
                target.getClass().getInterfaces(),
                this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("代理模式");
        return method.invoke(target,args);
    }
}
package com.dynamicProxy;



public class Test {
    public static void main(String[] args) {
        //1、创建委托对象
        Apple apple = new Apple();
        //2、动态创建代理对象
        MyInvocationHandler handler = new MyInvocationHandler();
        Phone phoneProxy = (Phone) handler.bind(apple);
        System.out.println(phoneProxy.salePhone());

    }
}

面试官问:怎么做到无侵入的增强方法? 答:代理。肯定是用动态代理啊。类似于切面编程,使用动态代理即可完成对一个或多个方法无侵入的增强。