要求目标类必须实现业务接口的类 。
原理:客户类调用代理方法,代理类 方法调用委托类,委托类调用invoke方法,invoke调用 目标方法,
invoke (
代理对象;
目标方法:
目标方法参数);
代理对象的名称有三部分构成:$+proxy+数字;
目标类对象在委托类中创建,这种情况不常见,一般都是在委托类中创建。由构造器注入的。
通过观看 代码我发现:
1. 委托类调用Proxy.newProxyInstnce; 2.然后P.newProxy调用委托类; 3.委托类调用invoke方法;
4.invoke方法调用目标类方法;
以下是我实践代码:
public interface service {
//业务接口
String doSome(int a,String b);
void doOther();
} public class serviceImple implements service {
// 目标方法
@Override
public String doSome(int a, String b) {
System.out.println("执行业务方法doSome()");
return a + b;
}
// 目标方法
@Override
public void doOther() {
System.out.println("执行业务方法doOther()");
}}
package entrusts;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import Service.service;
//委托类创建
public class ProxyEntrust implements InvocationHandler {
private service target;
//构造方法注入
public ProxyEntrust(service target) {
super();
this.target = target;
}
//proxy:代理对象
//Method:目标方法
//args:目标参数
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//执行目标方法
Object result=method.invoke(target,args);
return result;
}}
package client;
import java.lang.reflect.Proxy;
import Service.service;
import Service.serviceImple;
import entrusts.ProxyEntrust;
public class Client {
public static void main(String[] args) {
// 创建目标对象
service target = new serviceImple();
// 创建委托对象
ProxyEntrust ih = new ProxyEntrust(target);
// 创建代理对象
service service = (service) Proxy.newProxyInstance(
target.getClass().getClassLoader(), // 目标类的类加载器
target.getClass().getInterfaces(), // 目标类所实现的所有接口
ih); // 委托对象
// 调用代理对象的代理方法
String someResult = service.doSome(5, "月份");
System.out.println("someResult = " + someResult);
}
}
JDK的动态代理
原创wx6307135cb9367 博主文章分类:before ssm ©著作权
©著作权归作者所有:来自51CTO博客作者wx6307135cb9367的原创作品,请联系作者获取转载授权,否则将追究法律责任
上一篇:什么是分布式应用开发?
下一篇:SVN安装注意问题
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
Cglib动态代理
cglib动态代理
cglib动态代理 -
Spring开发:动态代理的艺术与实践
本文深入分析了JDK和CGLIB两种动态代理技术在Spring框架中的应用。
动态代理 java JDK spring -
JDK的动态代理
在学习SpringAOP的时候,知道底层是使用代理机制来实现的。之前一直对代理有点模糊,那现在
System java 动态代理 -
jdk动态代理 cglib动态代理
jdk
java 反射 cgli jdk 动态代理