黑马程序员___java动态代理类

----------- android培训java培训、java学习型技术博客、期待与您交流! ---------

1.什么是动态代理?

答:动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实。代理一般会实现它所表示的实际对象的接口。代理可以访问实际对象,但是延迟实现实际对象的部分功能,实际对象实现系统的实际功能,代理对象对客户隐藏了实际对象。客户不知道它是与代理打交道还是与实际对象打交道。
2.为什么使用动态代理?

答:因为动态代理可以对请求进行任何处理

3.使用它有哪些好处?

答:因为动态代理可以对请求进行任何处理
4.哪些地方需要动态代理?

答:不允许直接访问某些类;对访问要做特殊处理等

目前Java开发包中包含了对动态代理的支持,但是其实现只支持对接口的的实现。
其实现主要通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。

Proxy类主要用来获取动态代理对象,InvocationHandler接口用来约束调用者实现

以下为模拟案例,通过动态代理实现在方法调用前后向控制台输出两句字符串

目录结构

<br/>

定义一个HelloWorld接口

1
package
com.ljq.test;
2

3
 /**
4
*
定义一个HelloWorld接口
5
*

6
*
@author
jiqinlin
7
*
8
*/
9
 publicinterface
HelloWorld {
10
publicvoid
sayHelloWorld();
11
}

<br/>

类HelloWorldImpl是HelloWorld接口的实现

1
package
com.ljq.test;
2

3
 /**
4
*
类HelloWorldImpl是HelloWorld接口的实现
5
*

6
*
@author
jiqinlin
7
*
8
*/
9
 publicclass
HelloWorldImpl implements
HelloWorld{
10

11
publicvoid
sayHelloWorld() {
12
System.out.println("HelloWorld!");
13
}
14

15
}

HelloWorldHandler是
InvocationHandler接口实现

1
package
com.ljq.test;
2

3
 import
java.lang.reflect.InvocationHandler;
4
 import
java.lang.reflect.Method;
5

6
 /**
7
*
实现在方法调用前后向控制台输出两句字符串
8
*

9
*
@author
jiqinlin
10
*
11
*/
12
 publicclass
HelloWorldHandler implements
InvocationHandler{
13
//要代理的原始对象
14
 private
Object obj;
15

16
public
HelloWorldHandler(Object obj) {
17
super();
18
this.obj
=
obj;
19
}
20

21
/**
22
*
在代理实例上处理方法调用并返回结果
23
*

24
*
@param
proxy 代理类
25
*
@param
method 被代理的方法
26
*
@param
args 该方法的参数数组
27
*/
28
public
Object invoke(Object proxy, Method method, Object[] args) throws
Throwable {
29
Object
result =null;
30
//调用之前
31
 
doBefore();
32
//调用原始对象的方法
33
result=method.invoke(obj,
args);
34
//调用之后
35
doAfter();
36
return
result;
37
}
38

39
privatevoid
doBefore(){
40
System.out.println("before
method invoke");
41
}
42

43
privatevoid
doAfter(){
44
System.out.println("after
method invoke");
45
}
46

47
}

测试类

package
com.ljq.test;

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

publicclass
HelloWorldTest {

publicstaticvoid
main(String[] args) {
HelloWorld helloWorld=new
HelloWorldImpl();
InvocationHandler handler=new
HelloWorldHandler(helloWorld);

//创建动态代理对象
HelloWorld
proxy=(HelloWorld)Proxy.newProxyInstance(
helloWorld.getClass().getClassLoader(),

helloWorld.getClass().getInterfaces(),

handler);
proxy.sayHelloWorld();
}
}

运行结果为:

----------- android培训java培训、java学习型技术博客、期待与您交流! ---------

时间: 2024-08-24 11:42:44

黑马程序员___java动态代理类的相关文章

黑马程序员——Java高新技术代理

代理 普通代理 很多时候,我们使用别人代码往往会发现别人代码的功能并不是十分符合我们的需求,调用别人的方法的时候,总是先new一个对象,然后我们的前处理做完,然后调用别人代码的方法,再加入后处理,这样做往往十分麻烦.代理就为其他类提供了一种控制其对象的方法.代理类和委托类必须实现同一个接口,这样代理类才能在需要的时候代替委托类对象,执行委托类的方法. interface Solution{ public void doSomething(); } //委托类Demo实现了接口 class Dem

黑马程序员___java断言

----------- android培训.java培训.java学习型技术博客.期待与您交流! --------- 下面介绍一下断言在JAVA中的使用,JAVA是从JDK1.4才开始支持断言的(添加了关键字assert),请注意老版的JRE不支持. 断言概述   编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设  可以将断言看作是异常处理的一种高级形式  断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真  可以在任何时候启用和禁用断言验证,因此可以在测

黑马程序员——Java集合工具类和泛型

Collections工具类和泛型 Collections和Collection Collections和Collection是不同的,Collections是工具类,用来操作集合的,而Collection是集合接口.Collections中有一系列的静态方法用来操作集合,但是不能更改集合内容.比如不能set()不能remove()元素,可以替换全部元素或者添加同一个元素. static List<String> list =Arrays .asList("one Two three

黑马程序员_Java基础String类

- - - - - android培训.java培训.期待与您交流! - - - - - - - String是一个对象 String不属于8种基本数据类型(byte, char, short, int, float, long, double, boolean),String是对象,所以其默认值是null. String是一种特殊的对象,有其它对象没有的一些特性,通过JDK发现: public final class String implements java.io.Serializable

黑马程序员___java注解小结

----------- android培训.java培训.java学习型技术博客.期待与您交流! --------- 注解是java 的一个新的类型(与接口很相似),它与类.接口.枚举是在同一个层次,它们都称作为java 的一个类型(TYPE).它可以声明在包.类.字段.方法.局部变量.方法参数等的前面,用来对这些元素进行说明,注释.它的作用非常的多,例如:进行编译检查.生成说明文档.代码分析等. JDK提供的几个基本注解 a. @SuppressWarnings 该注解的作用是阻止编译器发出某

黑马程序员___java反射机制

 ----------- android培训.java培训.java学习型技术博客.期待与您交流! --------- Java的反射机制的实现要借助于4个类:class,Constructor,Field,Method:其中class代表的时类对 象,Constructor-类的构造器对象,Field-类的属性对象,Method-类的方法对象.通过这四个对象我们可以粗略的看到一个类的各个组 成部分.Class:程序运行时,java运行时系统会对所有的对象进行运行时类型的处理.这项信息记录了每个

黑马程序员---Objective-C基础学习---类、对象、方法相关知识笔记

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 类.对象.方法相关知识笔记 Objective-C相对于C语言有了面向对象的特性,但是ObjC又没有其他面向对象语言那么多语法特性,ObjC本身对面向对象进行了精简.下面是一些相关知识笔记. 类定义 成员变量 方法和属性 self关键字 类定义 在C#.Java等其他高级语言中定义一个类是相当简单点的,直接一个关键字class加一对大括号基本就完成了,但是在ObjC中类的定义相对变化比较大.现

黑马程序员---类的本质

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! --- 类本身也是一个对象,是个Class类型的对象,简称类对象 Person *p = [[Person alloc] init]; Person *p1 = [[Person alloc] init]; //获取内存中的类对象 Class c = [p class]; Class c1 = [p1 class]; c==c1 //获取内存中的类对象 Class c2 = [Person class]; c

黑马程序员-Java基础-面向对象-类和对象、封装、构造函数、this、static、饿汉式&amp;懒汉式

第一讲  面向对象概念 1.  定义 相对于与面向过程而言的,将功能封装进对象,我们只关心具备了该功能的对象,而不用关注对象的具体细节. 面向对象的特点:使复杂问题简单化.我们只关心什么对象能处理什么事情,而不用关心具体的实现细节. 2.  面向对象特征 封装.继承.多态. 第二讲  类和对象的关系 1.  概述 类就是:对现实生活中事物的描述,可以是实体的事物也可以是一件事等: 对象是:是某类事物的实例,实实在在存在的个体: 映射到java中,描述就是class定义的类. 具体对象就是对应ja