代理概念不必多说,而Java程序中的代理就是通过代理类去访问被代理类,在不修改被代理类的前提下通过代理类扩展其功能。下面是一个伪代理实现过程:
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
27
|
public class Main {
public static void main(String[] args) throws Exception {
helloproxy hp = new helloproxy();
hp.proxyGen(new hello());
hp.sayHello();
}
}
class hello {
public void sayHello() {
System.out.println("Hello World");
}
}
class helloproxy {
private hello h;
public void proxyGen(hello h) {
this.h = h;
}
public void sayHello() {
System.out.println("Hello begin");
h.sayHello();
System.out.println("Hello end");
}
}
|
为什么说是伪代理呢?因为在代理模式的概念下代理类是为了扩展被代理类的功能,完善一些逻辑功能,本质上没有修改对象,而这里的运行对象被修改为了helloproxy
,并没有完善hello
类的功能,而是自己实现了一套逻辑。
静态代理就是上面伪代理的不足的完善,即在继承同一个接口的前提下实现代理类扩展被代理类的功能,因为此时保证了对象的一致性,可以利用多态实现不同的表现形式,满足面向对象编程的概念
示例代码
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
27
28
29
30
31
32
33
|
public class Main {
public static void main(String[] args) throws Exception {
helloproxy hp = new helloproxy();
hp.proxyGen(new hello());
hp.sayHello();
}
}
interface helloInterface {
void sayHello();
}
class hello implements helloInterface {
@Override
public void sayHello() {
System.out.println("Hello World");
}
}
class helloproxy implements helloInterface {
private hello h;
public void proxyGen(hello h) {
this.h = h;
}
@Override
public void sayHello() {
System.out.println("Hello begin");
h.sayHello();
System.out.println("Hello end");
}
}
|
静态代理由于因需求而编写大量的代理类会导致代码冗余,且代理类与被代理类的关系在编译时就会确定,不会有其他的修改,因此就有了动态代理的概念。
动态代理是通过反射技术在运行时实现一个接口并实现代理功能
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Main {
public static void main(String[] args){
helloInterface h = new hello();
proxyHandler handler = new proxyHandler(h);
helloInterface helloproxy = (helloInterface) Proxy.newProxyInstance(
h.getClass().getClassLoader(), // 获得当前类加载器
h.getClass().getInterfaces(), // 获取当前类实现的所有的接口数组
handler
);
helloproxy.sayHello();
}
}
interface helloInterface {
void sayHello();
}
class hello implements helloInterface {
@Override
public void sayHello() {
System.out.println("Hello World");
}
}
class proxyHandler implements InvocationHandler {
private Object obj;
// 构造器
public proxyHandler(Object obj) {
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("dynamic proxy: " + method.getName());
method.invoke(obj, args);
return null;
}
}
|
https://blog.csdn.net/H_X_P_/article/details/112217659
https://www.zhihu.com/question/402935302
https://www.jianshu.com/p/9bcac608c714
https://www.runoob.com/java/java-polymorphism.html