java动态代理

java动态代理,第1张

java动态代理

java动态代理

接口实现接口动态代理的使用验证

java的动态代理,需要实现接口的所有方法

接口
package com.chauncy;



public interface IAnimal {
    void run();
    void eat();
    void sleep();
}

实现接口
package com.chauncy;



public class Dog implements IAnimal {
    public void run() {
        System.out.println("Dog is run...");
    }

    public void eat() {
        System.out.println("Dog is eating...");
    }

    public void sleep() {
        System.out.println("Dog is sleeping");
    }
}

动态代理的使用
package com.chauncy;

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



public class AnimalProxy {
    // 参数是接口类型
    public static IAnimal getProxy(final IAnimal animal){
        IAnimal instance;
        // 获取类加载器
        ClassLoader loader = animal.getClass().getClassLoader();
        // 获取所有的接口 -- 被代理对象的所有接口
        Class[] interfaces = animal.getClass().getInterfaces();
        // 用来执行被代理类需要执行的方法
        InvocationHandler handler = new InvocationHandler() {
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                // 调用被代理类的方法
                return method.invoke(animal, args);
            }
        };
        //动态代理
        instance = (IAnimal) Proxy.newProxyInstance(loader, interfaces, handler);
        return instance;
    }
}
验证
public static void main(String[] args) {
        IAnimal proxy = AnimalProxy.getProxy(new Dog());
        System.out.println("proxy的类型是 : " + proxy.getClass());
        proxy.run();
    }

// proxy的类型是 : class com.sun.proxy.$Proxy0
// Dog is run...

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5716439.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存