我是 javapub,一名 Markdown 程序员从‍,八股文种子选手。

面试官: 那你能说一下反射和动态署理的关系吗?

提名人: 当然能够。动态署理是一种根据反射的机制,它能够在运行时动态地创立一个完成了指定接口的署理类,并将办法的调用转发到指定的处理器上。

动态署理通常用于完成 AOP(面向切面编程),它能够在不修正原有代码的情况下,为类增加额定的功用,例如日志记载、功能统计、事务管理等。

动态署理的完成依赖于反射机制,它能够在运行时动态地获取类的信息,并动态地创立署理类和署理目标。因而,反射是动态署理的根底。

面试官: 那你能举个比如来说明一下动态署理的运用吗?

提名人: 当然能够。例如,咱们能够运用动态署理来完成一个简单的日志记载器:

public interface MyInterface {
    void myMethod();
}
public class MyInterfaceImpl implements MyInterface {
    public void myMethod() {
        System.out.println("myMethod is called");
    }
}
public class MyInvocationHandler implements InvocationHandler {
    private Object target;
    public MyInvocationHandler(Object target) {
        this.target = target;
    }
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("before " + method.getName() + " is called");
        Object result = method.invoke(target, args);
        System.out.println("after " + method.getName() + " is called");
        return result;
    }
}
public class Main {
    public static void main(String[] args) {
        MyInterface target = new MyInterfaceImpl();
        MyInvocationHandler handler = new MyInvocationHandler(target);
        MyInterface proxy = (MyInterface) Proxy.newProxyInstance(
            target.getClass().getClassLoader(),
            target.getClass().getInterfaces(),
            handler
        );
        proxy.myMethod();
    }
}

在这个比如中,咱们界说了一个 MyInterface 接口和一个 MyInterfaceImpl 类,它完成了 MyInterface 接口。然后,咱们界说了一个 MyInvocationHandler 类,它完成了 InvocationHandler 接口,并在 invoke() 办法中增加了日志记载的逻辑。

最后,咱们在 Main 类中运用 Proxy.newProxyInstance() 办法来创立一个完成了 MyInterface 接口的署理目标,并将办法的调用转发到 MyInvocationHandler 上。当咱们调用署理目标的 myMethod() 办法时,会主动调用 MyInvocationHandler 中的 invoke() 办法,并输出日志记载信息。

面试官: 非常好,你对反射和动态署理的了解很深化。

提名人: 谢谢您的夸奖,我会持续努力学习,早日经过面试。

面试官: 那你能说一下动态署理的优缺陷吗?

提名人: 当然能够。动态署理的优点是能够在运行时动态地创立署理目标,从而完成愈加灵敏和强大的功用。它能够在不修正原有代码的情况下,为类增加额定的功用,例如日志记载、功能统计、事务管理等。此外,动态署理还能够完成 AOP(面向切面编程),从而提高代码的可重用性和可维护性。

动态署理的缺陷是功能比较低,由于它需求在运行时进行类型查看和办法调用,而且需求动态地创立署理目标。此外,动态署理只能署理接口,无法署理类,因而它的使用规模遭到一定的限制。

面试官: 那你能说一下动态署理和静态署理的区别吗?

提名人: 当然能够。静态署理是在编译时就已经确认署理目标和被署理目标的关系,而动态署理是在运行时动态地创立署理目标。静态署理需求手动编写署理类,而动态署理能够主动生成署理类。静态署理只能署理一个类或接口,而动态署理能够署理多个类或接口。

面试官: 那你能说一下动态署理的完成原理吗?

提名人: 当然能够。动态署理的完成原理是根据 Java 的反射机制和动态生成字节码技术。在运行时,动态署理会根据指定的接口或类,动态地生成一个署理类,并将办法的调用转发到指定的处理器上。署理类的生成过程是经过字节码生成器来完成的,它能够根据指定的接口或类,动态地生成一个署理类的字节码,并将其加载到内存中。署理类的字节码中包含了对被署理目标的引用,以及对署理办法的调用逻辑。当咱们调用署理目标的办法时,会主动调用署理类中的办法,并将办法的调用转发到指定的处理器上。

面试官: 非常好,你对动态署理的了解很深化。

提名人: 我经过面试了吗

面试官: 期望下次还能见到你。

《面试1v1》动态代理

最近我在更新《面试1v1》系列文章,主要以场景化的方式,讲解咱们在面试中遇到的问题,致力于让每一位工程师拿到自己心仪的offer,感兴趣能够重视JavaPub追更!

目录合集:

Gitee:https://gitee.com/rodert/JavaPub

GitHub:https://github.com/Rodert/JavaPub