java-代理
1.什么是java代理模式?
给目标对象提供一个代理对象,并且由代理对象控制对目标对象的引用
我们可以这样理解
我们是用户,代理类是支付宝,我们想用支付宝的转账功能,但是支付宝本身没有转账功能,
又恰好有一个类有支付功能(目标对象),那么支付宝可以用代理的方式,获取支付功能供用户使用
大致内存图

2.那如何让支付宝去获取转账功能呢?
(1)我们创建一个Person类
public class Person implements InvocationHandler {private Object o;public Person(Object o) {this.o=o;}
}
(2)创建接口类
public interface IZF {void zf(String name1,String name2,double money);
}
(3)创建一个支付类
public class ZF {public void zf(String name1, String name2, double money) {System.out.println(name1+"向"+name2+"转账"+money+"元");}}
(3)在测试类这样写
public static void main(String[] args) {
//ZFB代码支付宝Person ZFB =new Person(new ZF());}
这样我们就可以让支付宝指向支付类(即支付功能了)
我们既然已经指向了支付对象,那么我们再调用对象的方法,输入参数,是不是就可以调用到支付能了?
接下来的任务就是如获取到目标对象的方法,之后再调用目标对象的方法
3.获取目标对象的方法
要想获取目标对象的方法,首先要引用Proxy库
import java.lang.reflect.Proxy;
我们再Person类中定义了一个构造方法
private Object o;public Person(Object o) {this.o=o;}
来指定我们想获取的目标对象,获取的目标对象为o
所以要想获取目标对象的方法,我们就要对目标对象动手脚,用下面这种办法
public class Person implements InvocationHandler {private Object o;public Person(Object o) {this.o=o;}//获取目标对象public Object get() {return Proxy.newProxyInstance(o.getClass().getClassLoader(),o.getClass().getInterfaces(),this);}
}
解释这段代码:
-
Proxy.newProxyInstance()
是Java动态代理机制的核心方法,用于在运行时创建代理对象。 -
方法参数:
-
o.getClass().getClassLoader()
- 使用原始对象o
的类加载器来加载代理类 -
o.getClass().getInterfaces()
- 代理对象将实现原始对象o
实现的所有接口 -
this
- 将当前对象(通常是一个实现了InvocationHandler接口的对象)作为代理的调用处理器
-
-
返回值:
-
返回一个实现了原始对象
o
所有接口的代理对象 -
当调用代理对象的方法时,这些调用会被转发到当前对象的
invoke
方法(由InvocationHandler接口定义
-
根据这段代码我们获取了o(目标对象)对象的加载器以及接口,也就相当于获取了o对象的的class文件,以及其中的方法
4.调用目标对象的方法
第3点,我们已经获取到了目标文件内容及方法,那么我们该调取方法了
上代码:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class Person implements InvocationHandler {private Object o;public Person(Object o) {this.o=o;}public Object get() {return Proxy.newProxyInstance(o.getClass().getClassLoader(),o.getClass().getInterfaces(),this);}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {return method.invoke(o, args);}
}
我们获取了InvocationHandler接口 并用了它的invoke方法!调用方法成功!
5.完整代码+运行结果
Person类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class Person implements InvocationHandler {private Object o;public Person(Object o) {this.o=o;}public Object get() {return Proxy.newProxyInstance(o.getClass().getClassLoader(),o.getClass().getInterfaces(),this);}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {return method.invoke(o, args);}
}
IZF接口
public interface IZF {void zf(String name1,String name2,double money);
}
ZF接口
public class ZF implements IZF{@Overridepublic void zf(String name1, String name2, double money) {System.out.println(name1+"向"+name2+"转账"+money+"元");}}
测试类
public class Test {public static void main(String[] args) {Person ZFB =new Person(new ZF());IZF XX=(IZF)ZFB.get();XX.zf("小白","小黑",100.00);}}
运行结果: