首页 技术 正文
技术 2022年11月16日
0 收藏 585 点赞 2,408 浏览 1759 个字

在面试的时候面试题里有一道jdk的动态代理是原理,并给一个事例直接写代码出来,现在再整理一下

  jdk动态代理主要是想动态在代码中增加一些功能,不影响现有代码,实现动态代理需要做如下几个操作

    1.首先必须要有一个接口,被代理类必须实现这个接口(必须,原因是因为生成的代理类也实现这个接口,代理完得到的类可以用这个接口类型进接收)

    2.需要写一个自己的代理处理类,现在给它起个名字叫MyHandler,必须实现InvocationHandler,重写invoke方法(这个也是必须,我们要在Invoke(Object proxy, Method method, Object[] args)方法里面写自己的逻辑,调用被代理类的方法,invoke(Object proxy, Method method, Object[] args)方法里面的三个参数的意思为:代理类,被代理类的哪个方法,这个方法的参数是什么)

    3.MyHandler里面必须有一个成员变量,类型为Object,可以在构造方法的时候将这个成员变量的值赋进去(这个成员变量也是必须要有的,因为在invoke方法里面需要代理这个类执行这个对象的方法)

    4.得到代理对象是通过Proxy类的newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)方法得到,第一个是得到classLoader即可,第二个参数为接口,接口的数量可以多个,通过代理类可以得到:test.getClass().getInterfaces()就得到了,最后一个参数就是我们上面第2步里面自己写的代理类的实例,这样就得到了一个代理类,当然,是第一步定义的接口类型的,然后再调用得到这个对象,调用方法

    代码如下,需求是在被代理类的move方法执行前后加打印语句行:

定义的接口:

public interface Inter {
void move();
}

再写一个被代理类,叫ProxyClazz

 public class ProxyClazz implements Inter{     public void move(){
System.out.println("move...");
} }

处理代理的类:

public class TestProxy implements InvocationHandler{
  //被代理类,必须做为这个类的成员变量
private Object target; public TestProxy(){
super();
}

  //通过构造方法传值进来
public TestProxy(Object target) {
super();
this.target = target;
} @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("start");
//查看proxy类的命名方式:com.sun.proxy.$Proxy0
System.out.println(proxy.getClass().getName());
Object o = method.invoke(target, args);
System.out.println("end");
return o;
}}

测试用的main方法

public static void main(String[] args) throws Exception, Throwable{
Inter inter = new ProxyClazz();
TestProxy tp = new TestProxy(inter);
Inter interProxy =(Inter) Proxy.newProxyInstance(inter.getClass().getClassLoader(), inter.getClass().getInterfaces(), tp);
interProxy.move();
}

得到的结果为

start
com.sun.proxy.$Proxy0
move...
end

可以看到确实得到了代理类:$Proxy0

也满足了我们的需求,在新生成代理类中加入了我们想加入的功能

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,088
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,564
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,412
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,185
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,822
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,905