Java代理机制之初见(理解及实现)

都知道Java中的Spring,有一重要思想:AOP,也就是Java的动态代理机制。初见代理这个名词时,觉得生活中常有代理的这一说法。

那么,在Java中,代理又是什么呢?它又是如何实现的?实现后是干什么的?

其实啊,Java中的代理也就是生活中代理的意思,我认为,在Java中,代理就是帮助类实现一些修改的动作。

也就是说,用代理类来修改已经存在的类。那么,问题又来了,为何这样做呢?在存在的类上修改不就完事了吗?

首先,这种想法时错的,Java中,已经编译好的类不要随随便便的修改,容易造成整个工程的一系列问题。所以,使用这种方法就不需要修改已存在的类了,

可以对原类进行相应的动作。这样才符合编程的需求。

一、下面来具体说说代理:

大的方向来说代理可分为:静态代理和动态代理。而动态代理又有两种产生代理的方式:JDK和CGLiB。

二、静态代理的实现:

首先创建一个接口,然后创建具体实现类来实现这个接口,在创建一个代理类同样实现这个接口,不同之处在于,

具体实现类的方法中需要将接口中定义的方法的业务逻辑功能实现,而代理类中的方法只要调用具体类中的对应方法即可,

这样我们在需要使用接口中的某个方法的功能时直接调用代理类的方法即可,将具体的实现类隐藏在底层。

1.首先需要创建的接口:

1 package com.xupt.proxy.classes;
2
3 public interface IStudentProxyId {
4     void setId(String id);
5     String getId();
6 }
1 package com.xupt.proxy.classes;
2
3 public interface IStudentProxyName {
4     void setName(String name);
5     String getName();
6 }

2.实现这个接口的类:

 1 package com.xupt.proxy.classes;
 2
 3 public class StudentMessage implements IStudentProxyId,IStudentProxyName {
 4
 5     private String id;
 6     private String name;
 7
 8     public StudentMessage() {}
 9
10     @Override
11     public void setName(String name) {
12         this.name  = name;
13
14         System.out.println("StudentMessage.setName()");
15     }
16
17     @Override
18     public String getName() {
19         System.out.println("StudentMessage.getName()");
20
21         return name;
22     }
23
24     @Override
25     public void setId(String id) {
26         this.id = id;
27
28         System.out.println("StudentMessage.setId()");
29
30     }
31
32     @Override
33     public String getId() {
34         System.out.println("StudentMessage.getId()");
35
36         return id;
37     }
38
39 }

3.实现类的代理类:

无用框。。。。。。
 1 package com.xupt.proxy.proxy;
 2
 3 import com.xupt.proxy.classes.IStudentProxyId;
 4 import com.xupt.proxy.classes.IStudentProxyName;
 5 import com.xupt.proxy.classes.StudentMessage;
 6
 7 public class StudentProxy implements IStudentProxyId,IStudentProxyName{
 8
 9     StudentMessage message;
10
11     public StudentProxy() {
12     }
13
14     public StudentProxy(StudentMessage message) {
15         this.message = message;
16     }
17
18     @Override
19     public void setName(String name) {
20
21         System.out.println("置前拦截StudentProxy.setName()");
22         message.setName(name);
23         System.out.println("置后拦截StudentProxy.setName()");
24     }
25
26     @Override
27     public String getName() {
28
29         System.out.println("置前拦截StudentProxy.getName()");
30         String name = message.getName();
31         System.out.println("置后拦截StudentProxy.getName()");
32
33         return name;
34     }
35
36     @Override
37     public void setId(String id) {
38
39         System.out.println("置前拦截StudentProxy.setId()");
40         message.setName(id);
41         System.out.println("置后拦截StudentProxy.setId()");
42     }
43
44     @Override
45     public String getId() {
46         System.out.println("置前拦截StudentProxy.getId()");
47         String id = message.getId();
48         System.out.println("置后拦截StudentProxy.getId()");
49
50         return id;
51     }
52
53 }

4.定义测试类:

package com.xupt.proxy.demo;

import com.xupt.proxy.classes.StudentMessage;
import com.xupt.proxy.proxy.StudentProxy;

public class StudentProxyTest {

	public static void main(String[] args) {
		StudentProxy proxy = new StudentProxy(new StudentMessage());
		proxy.setId("222666");
		proxy.setName("张三");
		System.out.println("id: " + proxy.getId() + " " +  "name: " +proxy.getName());
	}

}

5.执行结果:

以上就是静态代理的实现过程,实现一次就觉得挺简单的。但是,静态代理就是将接口、实现类、代理类一次全部手动执行。但细想一下,如果我们需要很多代理,每次都重新手动完成,是不是不现实呢?每一个都这么手动的去创建实属浪费时间,而且会有大量的重复代码。所以,动态代理就出现了。事情总有解决的办法。

三:动态代理的实现:

后续更新。。。。。。。

原文地址:https://www.cnblogs.com/youdiaodaxue16/p/9867909.html

时间: 2024-10-30 22:38:43

Java代理机制之初见(理解及实现)的相关文章

Java 代理机制学习总结

-------<a href="http://www.itheima.com/"">android培训</a>.<a href="http://www.itheima.com/" ">java培训</a>期待与您交流!---------- Java 代理机制学习总结 在编写程序时,除了要解决核心业务逻辑时还要编写一些与核心业务逻辑相关的系统服务代码.如日志,安全等代码.在没有使用java代理机制时,

java代理机制简单实现

java代理分静态代理和动态代理,动态代理有jdk代理和cglib代理两种,在运行时生成新的子类class文件.本文主要练习下动态代理,代码用于备忘.对于代理的原理和机制,网上有很多写的很好的,就不班门弄斧了. jdk代理 Java代码下载    import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class Prox

java反射机制的粗略理解

java反射机制: 涉及的对象:Class, Object, 函数:Class类:[forName(String className):static:getClass():public],Object类:[getClass():public]. Class Class也是一个对象,但是你不能通过构造函数得到它,它都是由jvm产生的,它通过上面的两个方法得到实例,加上下面3一共三个方式: 1.通过Object类的getClass()方法.例如: Class c1 = new String("&qu

Java代理机制

1 引言 我们书写执行一个功能的函数时,经常需要在其中写入与功能不是直接相关但很有必要的代 码,如日志记录,信息发送,安全和事务支持等,这些枝节性代码虽然是必要的,但它会带 来以下麻烦: 枝节性代码游离在功能性代码之外,它下是函数的目的,这是对OO是一种破坏 枝节性代码会造成功能性代码对其它类的依赖,加深类之间的耦合,而这是OO系统所竭 力避免的 枝节性代码带来的耦合度会造成功能性代码移植困难,可重用性降低 从法理上说,枝节性代码应该`监视'着功能性代码,然后采取行动,而不是功能性代码 `通知'

转:一个经典例子让你彻彻底底理解java回调机制

一个经典例子让你彻彻底底理解java回调机制 以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的,其实我刚开始也是这样不理解,看了人家说比较经典的回调方式: Class A实现接口CallBack callback——背景1class A中包含一个class B的引用b —

【java代理】动态代理

java代理机制 Table of Contents 1 引言 2 常见的代理 3 代理模式UML图 4 代理模式实例 5 java动态代理 5.1 java动态代理UML图 6 代理模式与装饰者模式的区别 6.1 装饰者模式UML图 6.2 形象说明 1 引言 我们书写执行一个功能的函数时,经常需要在其中写入与功能不是直接相关但很有必要的代 码,如日志记录,信息发送,安全和事务支持等,这些枝节性代码虽然是必要的,但它会带 来以下麻烦: 枝节性代码游离在功能性代码之外,它下是函数的目的,这是对O

深入理解 Java 动态代理机制

Java 有两种代理方式,一种是静态代理,另一种是动态代理.对于静态代理,其实就是通过依赖注入,对对象进行封装,不让外部知道实现的细节.很多 API 就是通过这种形式来封装的. 代理模式结构图(图片来自<大话设计模式>) 下面看下两者在概念上的解释: 静态代理 静态代理类:由程序员创建或者由第三方工具生成,再进行编译:在程序运行之前,代理类的.class文件已经存在了. 静态代理类通常只代理一个类. 静态代理事先知道要代理的是什么. 动态代理 动态代理类:在程序运行时,通过反射机制动态生成.

java的动态代理机制详解

在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于 Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功能,我们更需要学习的是其底层是怎么样的一个原理,而AOP的原理就是 java的动态代理机制,所以本篇随笔就是对java的动态机制进行一个回顾. 在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Cla

java Proxy(代理机制)

我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功能,我们更需要学习的是其底层是怎么样的一个原理,而AOP的原理就是java的动态代理机制,所以本篇随笔就是对java的动态机制进行一个回顾. 在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Class),这一个类和接口是实现我