JDK中生成代理对象的API 代理类所在包:java.lang.reflect.Proxy JDK实现代理只需要使用newProxyInstance方法,但是该方法需要接收三个参数,完整的写法是:
static Object newProxyInstance(ClassLoader loader, Class [] interfaces, InvocationHandler handler)
注意该方法是在Proxy类中的静态方法,且接收的三个参数依次为:
java.lang.reflect.InvocationHandler:这是调用处理器接口,它自定义了一个 invoke 方法,用于集中处理在动态代理类对象上的方法调用,通常在该方法中实现对委托类的代理访问。
// 该方法负责集中处理动态代理类上的所有方法调用。第一个参数是代理类实例,第二个参数是被调用的方法对象,第三个参数是方法参数的数组形式
// 第三个方法是调用参数。
Object invoke(Object proxy, Method method, Object[] args)
代码示例:
package model;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface IUserDao {
void save();
}
class UserDao implements IUserDao {
public void save() {
System.out.println("----已经保存数据!----");
}
}
class ProxyFactory {
private Object target;
public ProxyFactory(Object target) {
this.target = target;
}
// 给目标对象生成代理对象,其class文件是由 JVM 在运行时动态生成
public Object getProxyInstance() {
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("开始");
// 执行目标对象方法,方法参数是target,表示该方法从属于target
Object returnValue = method.invoke(target, args);
System.out.println("提交");
return returnValue;
}
});
}
}
public class Client {
public static void main(String[] args) {
// 目标对象
IUserDao target = new UserDao();
System.out.println(target.getClass());
// 代理对象
IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();
System.out.println(proxy.getClass());
proxy.save();
}
}
输出:
class model.UserDao
class model.$Proxy0
开始
----已经保存数据!----
提交
总结: 代理对象不需要实现接口,但是目标对象一定要实现接口,否则不能用动态代理
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。