美文网首页
Java反射 动态代理

Java反射 动态代理

作者: lc_666 | 来源:发表于2020-04-02 22:14 被阅读0次

代理模式

  • 使用一个代理将对象包装起来,使用该代理来取代原始对象;
  • 任何对原始对象的调用要通过代理来调用;
  • 代理类和被代理类需要实现同样的接口;

静态代理实例

  • 代理类和被代理类在编译期间已经被确认;
public class StaticProxyTest {

    public static void main(String[] args) {
        NikeShoeFactory nikeShoeFactory = new NikeShoeFactory();
        ProxyShoeFactory proxyShoeFactory = new ProxyShoeFactory(nikeShoeFactory);
        proxyShoeFactory.makeShoes();
    }
}

interface ShoeFactory{
    void makeShoes();
}

//代理类
class ProxyShoeFactory implements ShoeFactory{

    private ShoeFactory shoeFactory;

    public ProxyShoeFactory(ShoeFactory shoeFactory) {
        this.shoeFactory = shoeFactory;
    }

    @Override
    public void makeShoes() {
        System.out.println("Proxy begins...");
        shoeFactory.makeShoes();
        System.out.println("Proxy ends...");

    }
}
//代理类
class NikeShoeFactory implements ShoeFactory{

    @Override
    public void makeShoes() {
        System.out.println("Making nike shoes...");
    }
}

动态代理实例

  • 创建接口及被代理类;
public interface Actor {
    void act();

    String sing();
}

//被代理类
public class HuaYiActor implements Actor {

    @Override
    public void act() {
        System.out.println("I am acting....");
    }

    @Override
    public String sing() {
        return "Lalalalala.....";
    }
}
  • 创建 代理工厂类;
//代理类工厂
public class ProxyFactory {
    // 提供静态方法,放回一个代理类的对象
    public static Object getProxyInstance(Object object) {

        MyInvocationHandler myInvocationHandler =new MyInvocationHandler();
        myInvocationHandler.setObject(object);

        return Proxy.newProxyInstance(object.getClass().getClassLoader(),
                object.getClass().getInterfaces(),
                myInvocationHandler);
    }
}

public class MyInvocationHandler implements InvocationHandler {
    // 需要使用被代理类的对象进行初始化
    private Object object;

    public void setObject(Object object) {
        this.object = object;
    }

    /**
     * 使用代理类的对象调用被代理类的方法时,会调用此方法
     * @param proxy
     * @param method 代理类的方法,也就是需要被代理类执行的方法
     * @param args 代理类方法的参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return method.invoke(object, args);
    }
}
  • 测试
public class ProxyTest {
    public static void main(String[] args) {
        HuaYiActor actor = new HuaYiActor();
        Actor proxyInstance = (Actor) ProxyFactory.getProxyInstance(actor);
        actor.act();
        String sing = actor.sing();
        System.out.println(sing);
        //I am acting....
        //Lalalalala.....
    }
}

相关文章

  • Java基础:反射

    反射注解动态代理相关阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 ...

  • 安卓反射和动态代理的应用

    提纲 java反射基础 反射在Android中的应用 Java动态代理 动态代理在Android的应用 java反...

  • 一文带你搞懂Java反射和动态代理

    分享 Java反射和动态代理

  • Java 动态代理

    前言 关于动态代理 JDK动态代理 CGLIB动态代理 区别 java动态代理是利用反射机制生成一个实现代理接口的...

  • Java反射机制详解(二)

    本篇文章继续介绍Java反射机制,不同的是侧重于介绍动态代理。动态代理是代理模式中的一种,是通过Java反射机制来...

  • Java反射机制总结(二)

    本篇文章继续介绍Java反射机制,不同的是侧重于介绍动态代理。动态代理是代理模式中的一种,是通过Java反射机制来...

  • 快速上手 Kotlin 开发系列之动态代理

    本节介绍 Kotlin 中没有反射的动态代理。 Java 中的动态代理 在讲 Kotlin 的动态代理之前先简单回...

  • 2021校招 复习总结

    笔记导航: JAVA: 泛型 反射和动态代理 注解 JAVA多线程 ReentrantLock,Volatile,...

  • Java动态代理

    1、什么是动态代理 动态代理利用Java的反射技术(Java Reflection)生成字节码,在运行时创建一个实...

  • Spring笔记

    1.Spring用到的动态代理分为java动态代理和CGILB动态代理,相同点是都是通过反射机制创建运行时被代理类...

网友评论

      本文标题:Java反射 动态代理

      本文链接:https://www.haomeiwen.com/subject/syfqphtx.html