首页 > 其他分享 >JDK动态代理

JDK动态代理

时间:2022-11-24 14:04:11浏览次数:44  
标签:personDao name JDK Object 代理 参数设置 动态 public targetObject


知识点

public class JDKProxy implements InvocationHandler {
private Object targetObject;//代理的目标对象
public Object createProxyInstance(Object targetObject){
this.targetObject = targetObject;
/*
* 第一个参数设置代码使用的类装载器,一般采用跟目标类相同的类装载器
* 第二个参数设置代理类实现的接口
* 第三个参数设置回调对象,当代理对象的方法被调用时,会委派给该参数指定对象的invoke方法
*/
return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(),
this.targetObject.getClass().getInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
return method.invoke(this.targetObject, args);//把方法调用委派给目标对象
}
}
当目标类实现了接口,我们可以使用jdk的Proxy来生成代理对象。




照样实现步骤:

第一步:编写代理类

public class JDKProxy implements InvocationHandler {
private Object targetObject;//代理的目标对象
public Object createProxyInstance(Object targetObject){
this.targetObject = targetObject;
/*
* 第一个参数设置代码使用的类装载器,一般采用跟目标类相同的类装载器
* 第二个参数设置代理类实现的接口
* 第三个参数设置回调对象,当代理对象的方法被调用时,会委派给该参数指定对象的invoke方法
*/
return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(),
this.targetObject.getClass().getInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
return method.invoke(this.targetObject, args);//把方法调用委派给目标对象
}
}
当目标类实现了接口,我们可以使用jdk的Proxy来生成代理对象。

第二步:编写PersonServer。java和接口IPersonServer.java

public interface IPersonServer {

public abstract void save();

}


public class PersonServer implements IPersonServer {

private IPersonDao personDao;
private String name;

public PersonServer(){}

/*
* 通过构造器来注入依赖对象
*/
public PersonServer(IPersonDao personDao, String name) {

this.name = name;
this.personDao = personDao;

}
public PersonServer(String name){
this.name=name;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public IPersonDao getPersonDao() {
return personDao;
}

// @Resource(name="mypersonDao")
// @Autowired
public void setPersonDao(IPersonDao personDao) {
this.personDao = personDao;
}

public void save() {
System.out.println("Test JDK Proxy");
}
}

第三步:编写单元测试

@Test
public void TestJDKProxy()
{
createJDKProxy proxy=new createJDKProxy();
//转换为实现接口
IPersonServer personServer=(IPersonServer)proxy.createProxyInstance(new PersonServer("liyong"));
personServer.save();
}

标签:personDao,name,JDK,Object,代理,参数设置,动态,public,targetObject
From: https://blog.51cto.com/u_13991401/5883747

相关文章

  • 使用CGLIB生成代理
    知识点【使用前提条件:【/**如果这个代理的类没有实现接口就不能使用JDK中的动态代理*这时需要使用第三方的.jarCGLIB实现代理**/......
  • 为什么要使用IP代理服务器?代理服务器的基本功能有哪些?
    每一个网站背后都有一个固定的Ip地址,这个地址可以显示网站的身份地址,提高网站的安全系数。那么为什么要使用ip代理服务器?的基本功能有哪些?Maxproxy小编简单的告诉大家! ......
  • 代码随想录训练营第四十三天 | 动态规划背包问题
     今天是第四十三天,还是背包问题1049.最后一块石头的重量II classSolution{publicintlastStoneWeightII(int[]stones){intn=stones.lengt......
  • Maxproxy代理IP软件正式上线,完美替代911IP代理软件。
    7月28日911s5宣布永久性关闭服务,那么还有类似的软件替代吗?!答案是有的!  Maxproxy全球顶级IP代理服务商采用国际运营商纯住宅IP高性能、高匿名性、稳定的服务器、没......
  • 是时候考虑升级 JDK 17 了
    Spring,作为JavaEE的事实规范,在2022年11月16日发布了最新的6.0.0GA版本。这个版本是框架后续新生代的初始版本,拥抱持续创新的OpenJDK和Java生态。新的版本以Java......
  • android动态换肤使用本地资源原理分析
    大致原理:在application里面注册所有activity回调这样可以实现很少的改动侵入性给LayoutFactory设置自己的​​factory2​​,工厂2使activity在​​setContentView​​调用......
  • 3D表白动态相册-包含源码压缩包和方法
    文章目录​​1.先上个例子​​​​2.HTML页面设计​​​​3.css风格设计​​​​4.12张图片​​​​5.GitHub仓库自行下载​​​​6.结果​​​​注记​​1.先上个例......
  • import和export的用法及动态引入和静态引入的区别
    本文转载自https://www.ucloud.cn/yun/104458.html摘要:命令用于规定模块的对外接口,命令用于输入其他模块提供的功能。前者用于服务器,后者用于浏览器。命令接受一对大括号......
  • 记录一些JDK的新特性~持续更新
    1、record快速定义类@TestpublicvoidtestRecord(){/***JDK16新特性**@paramstart*@paramend......
  • 关于Jdk线程池
    主要参数corepoolSize 核心线程数量maximumPoolSize最大线程数量threadFactory线程工厂用来生成线程workQueue工作队列keepAliveTime线程的闲置存活时间reje......