Inhaltsverzeichnis
Grundkonzepte
Statischer Proxy
Dynamischer Proxy
1. Dynamischer JDK-Proxy
2.CLGIB dynamischer Proxy
Heim Java javaLernprogramm 10.Java-Grundlagen – Agent

10.Java-Grundlagen – Agent

Feb 27, 2017 am 10:41 AM

Grundkonzepte

Proxy bedeutet in Java: Bereitstellung eines Proxy-Objekts für ein Objekt, und der Proxy Das Objekt steuert den Zugriff zum Originalobjekt, das heißt, der Client steuert das Originalobjekt nicht direkt, sondern steuert das Originalobjekt indirekt über das Proxy-Objekt.

Für Laien ist es so, als würde man eine Fahrkarte kaufen. Ursprünglich brauchten wir einen Bahnhof, um eine Fahrkarte zu kaufen, aber jetzt haben wir Fahrkartenverkaufsstellen eingerichtet, und Sie können Fahrkarten direkt über die Fahrkartenverkaufsstellen kaufen.

Die Arten von Agenten sind:

  • Die Implementierung von Agenten kann in statische Agenten und dynamische Agenten unterteilt werden;

  • Dynamische Agenten werden auch in dynamische JDK-Proxys und dynamische CLGIB-Proxys unterteilt.


Statischer Proxy

In einem statischen Proxy kann jede Proxy-Klasse nur eine Schnittstelle bedienen.

Die Nachteile dieses Ansatzes liegen auf der Hand:

  • Zu viele Proxys generieren. Weil mehrere Schnittstellen mehrere Proxy-Klassen erfordern.

  • Code-Redundanz. Alle Proxy-Operationen sind bis auf die von ihnen aufgerufene Methode gleich.

Sehen wir uns das Beispiel eines statischen Proxys an:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

// 定义一个接口,代表书interface Book {    void read();

}// 委托类(实现接口,包含了具体的业务逻辑)class Bible implements Book {    @Override

    public void read() {

        System.out.println("Reading...");

    }

}// 静态代理类(其实是对 Bible 类的增强)class BookProxy implements Book {    //委托对象,作为构造函数的参数

    private Book book; 

 

    BookProxy(Book book) {        this.book = book;

    }    @Override

    public void read() {

        System.out.println("Reading 调用之前");

        book.read();

        System.out.println("Reading 调用之后");

    }

}public class Test {

    public static void main(String[] args) {        //静态代理调用

        Book book = new Bible()

        BookProxy bookProxy = new BookProxy(book);

        bookProxy.read();

    }

}

Nach dem Login kopieren

Dynamischer Proxy

Dynamischer Proxy kann Lösen Sie das Problem. Der Nachteil des statischen Proxys besteht darin, dass er alle Proxy-Funktionen über eine Proxy-Klasse ausführen kann.

Dynamische Proxys werden in dynamische JDK-Proxys und dynamische CLGIB-Proxys unterteilt.

DKs dynamischer Proxy basiert auf der Schnittstelle, und der dynamische CLGIB-Proxy gleicht dieses Manko einfach aus.


1. Dynamischer JDK-Proxy

Der dynamische JDK-Proxy basiert auf der Schnittstellenimplementierung. Wenn einige Klassen die Schnittstelle nicht implementieren, können Sie den JDK-Proxy nicht verwenden.

Sehen wir uns das Beispiel an:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

// 定义一个接口,代表书...// 委托类(实现接口,包含了具体的业务逻辑)...

// 动态代理类

class BookHandler implements InvocationHandler{   

private Object target;   

//绑定委托对象(JDK 动态代理的缺陷,只能绑定接口)并返回一个代理类

    Object bind(Object target){       

    this.target = target;       

    // 取得代理对象

        return Proxy.newProxyInstance(

            target.getClass().getClassLoader(), // 类加载器

            target.getClass().getInterfaces(),  // 类的所有接口

            this); // InvocationHandler

    }    @Override

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        System.out.println("Reading 调用之前");

        method.invoke(target, args);

        System.out.println("Reading 调用之后");        return null;

    }

}public class Test {

    public static void main(String[] args) {        // 动态代理调用

        Book book = new Bible();

        BookHandler bookHandler = new BookHandler();

        Book bookProxy = (Book) bookHandler.bind(book);

        bookProxy.read();

    }

}

Nach dem Login kopieren

2.CLGIB dynamischer Proxy

clgib implementiert Proxy für Klassen, das Prinzip ist um eine Unterklasse für die angegebene Zielklasse zu generieren und die Methode zu überschreiben, um eine Verbesserung zu erreichen.

Da Vererbung verwendet wird, können endgültig geänderte Klassen nicht als Proxy verwendet werden.

Schauen wir uns das Beispiel an:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

// 实现类(没有了接口,直接实现业务逻辑)class Book {    public void read() {

        System.out.println("Reading...");

    }

}// 动态代理类class BookCglib implements MethodInterceptor{    private Object target;

 

    Object getInstance(Object target){        this.target = target;

        Enhancer enhancer = new Enhancer();

        enhancer.setSuperclass(this.target.getClass());        //回调方法

        enhancer.setCallback(this);        //创建代理对象

        return enhancer.create();

    }    @Override

    public Object intercept(Object object, Method method, Object[] args, MethodProxy proxy) throws Throwable {

        System.out.println("Reading 调用之前");

        proxy.invoke(target, args);

        System.out.println("Reading 调用之后");        return null;

    }

 

}public class Test {

    public static void main(String[] args) {

        BookCglib bookCglib =  new BookCglib();

        Book book = (Book) bookCglib.getInstance(new Book());

        book.read();

    }

}

Nach dem Login kopieren

Das Obige ist der Inhalt von 10.Java Basics - Proxy. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (. www.php.cn)!


Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße Artikel -Tags

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Quadratwurzel in Java Quadratwurzel in Java Aug 30, 2024 pm 04:26 PM

Quadratwurzel in Java

Perfekte Zahl in Java Perfekte Zahl in Java Aug 30, 2024 pm 04:28 PM

Perfekte Zahl in Java

Zufallszahlengenerator in Java Zufallszahlengenerator in Java Aug 30, 2024 pm 04:27 PM

Zufallszahlengenerator in Java

Armstrong-Zahl in Java Armstrong-Zahl in Java Aug 30, 2024 pm 04:26 PM

Armstrong-Zahl in Java

Weka in Java Weka in Java Aug 30, 2024 pm 04:28 PM

Weka in Java

Fragen zum Java Spring-Interview Fragen zum Java Spring-Interview Aug 30, 2024 pm 04:29 PM

Fragen zum Java Spring-Interview

Smith-Nummer in Java Smith-Nummer in Java Aug 30, 2024 pm 04:28 PM

Smith-Nummer in Java

Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

Brechen oder aus Java 8 Stream foreach zurückkehren?

See all articles