利用反射实现动态代理

    xiaoxiao2026-08-07  12

    代理模式:代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

    分析得出设计到三个对象:

    其一:抽象类接口

    其二:被代理类(具体实现抽象接口的类)

    其三:代理类:实际调用被代理类的方法和属性的类,

    动态代理,就是根据对象在内存中加载的Class类创建运行时类对象,从而调用代理类方法和属性。具体代码示例如下。

    <span style="font-family: Arial, Helvetica, sans-serif;">//</span><span style="color: rgb(51, 51, 51); font-family: arial, 宋体, sans-serif; font-size: 14px; line-height: 24px;">抽象类接口</span> interface Human {<span> </span> void info(); void fly(); } // 被代理类 class SuperMan implements Human { public void info() { System.out.println("我是超人!我怕谁!"); } public void fly() { System.out.println("I believe I can fly!"); } } class MyInvocationHandler implements InvocationHandler { Object obj;// 被代理类对象的声明 public void setObject(Object obj) { this.obj = obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object returnVal = method.invoke(obj, args); return returnVal; } } class MyProxy { // 动态的创建一个代理类的对象<strong>(重点) public static Object getProxyInstance(Object obj) { MyInvocationHandler handler = new MyInvocationHandler(); handler.setObject(obj); return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj .getClass().getInterfaces(), handler);</strong> } } public class TestAOP { public static void main(String[] args) { SuperMan man = new SuperMan();//创建一个被代理类的对象 Object obj = MyProxy.getProxyInstance(man);//返回一个代理类的对象 Human hu = (Human)obj; hu.info();//通过代理类的对象调用重写的抽象方法 System.out.println(); hu.fly(); } }
    转载请注明原文地址: https://ju.6miu.com/read-1310954.html
    最新回复(0)