静态代理

静态代理概念

在Java编程中,静态代理是一种设计模式,它允许通过一个代理类来控制对一个对象的访问。

静态代理实现

先提供一个接口

1
2
3
4
5
6
package com.ex2.www;

//定义一个接口
public interface IUser {
void show();
}

接口的一个实现类

1
2
3
4
5
6
7
8
9
10
11
package com.ex2.www;

//实现接口的具体类
public class Usermpl implements IUser {

@Override
public void show() {
System.out.println("show");
}

}

然后是一个代理类

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.ex2.www;

public class UserProxy implements IUser {
IUser user; //使用接口数据类型
public UserProxy(IUser user) {
this.user = user;
}
@Override
public void show() {
user.show();
System.out.println("调用了show");
}
}

然后是测试类

1
2
3
4
5
6
7
8
9
10
11
package com.ex2.www;

//主类使用接口类型引用具体实现
public class ProxyTest {
public static void main(String[] args) {
IUser user = new Usermpl();
//user.show();
IUser userProxy = new UserProxy(user);
userProxy.show();
}
}

动态代理

动态代理概念

动态代理是一种在运行时创建代理对象的技术,它允许在不修改原始代码的情况下增强方法的功能

动态代理实现

提供一个接口

1
2
3
4
5
6
7
package com.ex3.www;

import java.lang.reflect.Proxy;

public interface IUser {
public void show();
}

接口的实现类

1
2
3
4
5
6
7
8
9
package com.ex3.www;

public class UserImpl implements IUser {
@Override
public void show() {
System.out.println("show");
}

}

接下来要使用的方法是Proxy.newProxyInstance,我们看一下他的参数

img

1.类加载器,2.接口,3.调用处理器

然后我们需要一个处理器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.ex3.www;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class UserinvationHandler implements InvocationHandler {
IUser user;

public UserinvationHandler(IUser user) {
this.user = user;
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
method.invoke(user, args); //相当于获取一个show方法,给到了method,利用反射调用的是user的method方法
return null;
}
}

接口是InvocationHandler而他只有一个方法就是invoke,对其进行一个重写,利用反射去调用一个方法。

测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.ex3.www;

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

public class ProxyTest {
public static void main(String[] args) {
IUser user = new UserImpl();
InvocationHandler userinvationhandler = new UserinvationHandler(user); //传入一个对象,也就是user

IUser iUser = (IUser) Proxy.newProxyInstance(user.getClass().getClassLoader(),
user.getClass().getInterfaces(),
userinvationhandler);
iUser.show(); //调用show,也是传输show(个人理解)
}
}

写了好理解一点