Rumah  >  Artikel  >  Java  >  Contoh analisis proksi dinamik dan proksi statik dalam Java

Contoh analisis proksi dinamik dan proksi statik dalam Java

WBOY
WBOYke hadapan
2023-05-05 21:37:081493semak imbas

    0. Mod ejen

    Mengapa kita perlu mempelajari mod ejen? Ini ialah lapisan bawah SpringAOP [SpringAOP dan SpringMVC]

    Klasifikasi mod proksi:

    • Proksi statik

    • Proksi dinamik

    1 Proksi statik

    Dalam proksi statik, peningkatan kami bagi setiap kaedah objek sasaran dilakukan secara manual ( The kod akan ditunjukkan secara terperinci kemudian_), sangat tidak fleksibel (contohnya, sebaik sahaja kaedah baharu ditambahkan pada antara muka, objek sasaran dan objek proksi mesti diubah suai) dan menyusahkan (_perlu menulis kelas proksi berasingan untuk setiap kelas sasaran ). Terdapat sangat sedikit senario aplikasi sebenar, dan hampir tiada senario di mana proksi statik digunakan dalam pembangunan harian.

    Analisis peranan:

    • Peranan abstrak: Secara umumnya, antara muka atau kelas abstrak digunakan untuk menyelesaikan masalah

    • Watak sebenar: watak ejen

    • Peranan ejen: ejen untuk watak sebenar Selepas berlakon untuk watak sebenar, kami biasanya melakukan beberapa operasi subsidiari

    • Pelanggan: Orang yang mengakses objek proksi!

    Langkah kod:

    1 Antara Muka

    public interface Rent {
        public void rent();
    }

    2. Peranan ejen

    //房东
    public class Host implements Rent {
        public void rent() {
            System.out.println("房东要租房子");
        }
    }

    4. Akses pelanggan kepada peranan ejen

    public class Proxy implements Rent{
        private Host host;
        public Proxy() {
        }
        public Proxy(Host host) {
            this.host = host;
        }
        public void rent(){
            seeHouse();
            host.rent();
            fare();
        }
        //看房
        public void seeHouse(){
            System.out.println("中介带你看房");
        }
        //收中介费
        public void fare(){
            System.out.println("中介收费");
        }
    }

    Faedah mod ejen:

      boleh buat peranan sebenar Operasi ini lebih tulen! Tidak perlu memberi perhatian kepada beberapa perniagaan awam
    • Orang ramai akan diserahkan kepada peranan ejen! Realisasikan pembahagian kerja dalam perniagaan!
    • Apabila perkhidmatan awam berkembang, pengurusan berpusat adalah mudah!
    Kelemahan:

    Peranan sebenar akan menjana peranan proksi dari perspektif JVM, proksi statik menukar antara muka, kelas Pelaksanaan dan kelas proksi telah menjadi fail kelas sebenar.

    2. Memperdalam pemahaman anda tentang

    AOP, model proksi asas

    Contoh analisis proksi dinamik dan proksi statik dalam Java3 🎜>

    Proksi dinamik mempunyai peranan yang sama seperti proksi statik

    • Kelas proksi proksi dinamik dijana secara dinamik, bukan ditulis secara langsung oleh kami!

    • Proksi dinamik dibahagikan kepada dua kategori: proksi dinamik berasaskan antara muka dan proksi dinamik berasaskan kelas

    • Berasaskan antara muka— —JDK proksi dinamik

      • Berdasarkan kelas: cglib dynamic proksi

      • java bytecode pelaksanaan: javasist

      • Anda perlu memahami dua kelas: Proksi: kelas proksi, InvocationHandler: pengendali panggilan

      Dari perspektif JVM, proksi dinamik menjana kod bait kelas secara dinamik pada masa jalan dan dimuatkan ke dalam JVM .

    public class Client {
        public static void main(String[] args) {
            Host host = new Host();
            //代理,代理角色一般会有附属操作!
            Proxy proxy = new Proxy(host);
            proxy.rent();
        }
    }

    Faedah proksi dinamik:

    boleh menjadikan pengendalian aksara sebenar lebih tulen! Tidak perlu berurusan dengan beberapa perniagaan awam

    • Hal ehwal awam akan diserahkan kepada peranan ejen! Pelaksanaan

    • //Proxy是生成动态代理类,提供了创建动态代理类和实例的静态方法,它也是由这些方法创建的所有动态代理类的超类。
      //InvocationHandler-- invoke 调用处理程序并返回接口, 是由代理实例的调用处理程序实现的接口 。
    • 1.

    : Pemuat kelas, digunakan untuk memuatkan objek proksi. loader2.: Beberapa antara muka yang dilaksanakan oleh kelas proksi;

    3.interfaces : Melaksanakan Objek antara muka

    ;

    Untuk melaksanakan proksi dinamik, anda juga mesti melaksanakan untuk menyesuaikan logik pemprosesan. Apabila objek proksi dinamik kami memanggil kaedah, panggilan ke kaedah ini akan dimajukan ke kaedah h kelas yang melaksanakan antara muka InvocationHandler.

    public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h){
    }

    InvocationHandler1.InvocationHandlerproksi: kelas proksi yang dijana secara dinamikinvoke

    2.kaedah: sepadan dengan kaedah yang dipanggil oleh objek kelas proksi

    3.args: Parameter kaedah kaedah semasa

    Contoh proksi dinamik

    1 Tentukan antara mukarreee

    2 Antaramuka sewa

    public interface InvocationHandler {
        Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
    }

    3. Tentukan kaedah kelas proksi dinamik JDK

    public interface Rent {
        public void rent();
    }

    : Apabila objek proksi dinamik kami memanggil kaedah asli, apa yang sebenarnya dipanggil ialah kaedah

    dan maka kaedah

    memanggil kaedah asli objek proksi bagi pihak kami.

    4. Dapatkan kelas kilang objek proksiinvoke()

    public class Host implements Rent {
        @Override
        public void rent() {
            System.out.println("房东要租房");
        }
    }
    invoke()invoke(): terutamanya mendapatkan objek proksi kelas tertentu melalui kaedah

    5. Penggunaan sebenar

    public class DebugInvocationHandler implements InvocationHandler {
        /**
         * 代理类中的真实对象
         */
        private final Object target;
        public DebugInvocationHandler(Object target){
            this.target = target;
        }
        /**
         * 当你使用代理对象调用方法的时候实际会调用到这个方法
         */
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            //调用方法前
            System.out.println("before method" + method.getName());
            Object res = method.invoke(target, args);
            //调用方法后
            System.out.println("after method" + method.getName());
            return res;
        }
    }
    getProxy()Proxy.newProxyInstance()Output menjalankan ejen di atas

    sebelum methodrentTuan tanah ingin menyewaselepas methodrent

    Atas ialah kandungan terperinci Contoh analisis proksi dinamik dan proksi statik dalam Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan:
    Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam