起航学习网

- 让每个人都能学到最前沿新知识、新技能!
起航学习网
当前位置: 起航学习网 > 短期培训 > 编程语言 > Java学习中如何将代理对象保存到本地文件

Java学习中如何将代理对象保存到本地文件

时间:2021-07-29 15:17:47来源:Java开发培训网 作者:Java开发教程网 已有: 名学员访问该课程

前言: 我们知道,在Java中,常用的动态代理技术有JDK的动态代理和cglib动态代理,但是不管是哪种方式,代理对象都是在程

我们知道,在Java中,常用的动态代理技术有JDK的动态代理和cglib动态代理,但是不管是哪种方式,代理对象都是在程序运行时,运用反射机制动态创建而成,而我们并不能直观的看到生成的代理对象对应的Java源代码。下面,我就提供一种方式,可以将通过动态代理创建的代理对象的字节码文件保存到磁盘,再通过反编译工具查看生成文件的内容,这样就可以加深我们对于代理对象的理解。

JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理,这就要使用cglib动态代理了,在此,我们以JDK的动态代理为例。

在JDK中提供了一个ProxyGenerator类,可以将代理对象的字节码得到,我们再通过一个输出流就可以将文件保存到磁盘了。

首先定义一个接口:

package cn.itcast.jdkproxy;

public interface IUserDao {

public void save();

}

针对上面接口提供一个实现类:

package cn.itcast.jdkproxy;

public class UserDaoImpl implements IUserDao{

public void save() {

System.out.println("完成保存操作");

}

}

通过JDK动态代理技术创建代理对象:

package cn.itcast.jdkproxy;

import Java.io.File;

import Java.io.FileOutputStream;

import Java.lang.reflect.InvocationHandler;

import Java.lang.reflect.Method;

import Java.lang.reflect.Proxy;

import sun.misc.ProxyGenerator;

public class JdkProxyTest {

public static void main(String[] args) throws Exception {

final IUserDao target = new UserDaoImpl();

IUserDao proxy = (IUserDao) Proxy.newProxyInstance(target.getClass()

.getClassLoader(), target.getClass().getInterfaces(),

new InvocationHandler() {

public Object invoke(Object proxy, Method method,

Object[] args) throws Throwable {

System.out.println(method.getName());

return method.invoke(target, args);

}

});

byte[] proxyClass = ProxyGenerator.generateProxyClass(proxy.getClass()

.getSimpleName(), proxy.getClass().getInterfaces());

//将字节码文件保存到D盘,文件名为$Proxy0.class

FileOutputStream outputStream = new FileOutputStream(new File(

"d:\\$Proxy0.class"));

outputStream.write(proxyClass);

outputStream.flush();

outputStream.close();

}

}

通过反编译工具可以查看生成的字节码文件的内容:

import cn.itcast.jdkproxy.IUserDao;

import Java.lang.reflect.InvocationHandler;

import Java.lang.reflect.Method;

import Java.lang.reflect.Proxy;

import Java.lang.reflect.UndeclaredThrowableException;

public final class $Proxy0 extends Proxy

implements IUserDao

{

private static Method m3;

private static Method m1;

private static Method m0;

private static Method m2;

public $Proxy0(InvocationHandler paramInvocationHandler)

throws

{

super(paramInvocationHandler);

}

public final void save()

throws

{

try

{

this.h.invoke(this, m3, null);

return;

}

catch (RuntimeException localRuntimeException)

{

throw localRuntimeException;

}

catch (Throwable localThrowable)

{

}

throw new UndeclaredThrowableException(localThrowable);

}

public final boolean equals(Object paramObject)

throws

{

try

{

return ((Boolean)this.h.invoke(this, m1, new Object[] { paramObject })).booleanValue();

}

catch (RuntimeException localRuntimeException)

{

throw localRuntimeException;

}

catch (Throwable localThrowable)

{

}

throw new UndeclaredThrowableException(localThrowable);

}

public final int hashCode()

throws

{

try

{

return ((Integer)this.h.invoke(this, m0, null)).intValue();

}

catch (RuntimeException localRuntimeException)

{

throw localRuntimeException;

}

catch (Throwable localThrowable)

{

}

throw new UndeclaredThrowableException(localThrowable);

}

public final String toString()

throws

{

try

{

return (String)this.h.invoke(this, m2, null);

}

catch (RuntimeException localRuntimeException)

{

throw localRuntimeException;

}

catch (Throwable localThrowable)

{

}

throw new UndeclaredThrowableException(localThrowable);

}

static

{

try

{

m3 = Class.forName("cn.itcast.jdkproxy.IUserDao").getMethod("save", new Class[0]);

m1 = Class.forName("Java.lang.Object").getMethod("equals", new Class[] { Class.forName("Java.lang.Object") });

m0 = Class.forName("Java.lang.Object").getMethod("hashCode", new Class[0]);

m2 = Class.forName("Java.lang.Object").getMethod("toString", new Class[0]);

return;

}

catch (NoSuchMethodException localNoSuchMethodException)

{

throw new NoSuchMethodError(localNoSuchMethodException.getMessage());

}

catch (ClassNotFoundException localClassNotFoundException)

{

}

throw new NoClassDefFoundError(localClassNotFoundException.getMessage());

}

}

版权声明:部分文字转载来自公开网络,版权归作者本人所有,推送文章除非无法确认,我们都会注明作者和来源。如果出处有误或侵犯到原作者权益,请与我们联系删除或授权事宜。

文章出自:http://qh.itpxw.cn/peixun/software/202191255.html

文章标题:Java学习中如何将代理对象保存到本地文件



免责声明:本站文章均由入驻起航学习网的会员所发或者网络转载,所述观点仅代表作者本人,不代表起航学习网立场。如有侵权或者其他问题,请联系举报,必删。侵权投诉

你也许会喜欢如下的文章?
(责任编辑:深圳学历教育网)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
培训学校
IT培训网 访问该机构站点 报名留言 加为好友 用户等级:注册会员 用户级别:10 机构名称:IT培训网 联 系 人:罗老师 联系电话:13783581536 联系手机:13783581536 在线客服:起航学习网客服 在 线 QQ:起航学习网客服 电子邮件: 网站域名:http://www.itpxw.cn 注册时间:2016-07-18 11:07 最后登录:2024-02-20 13:02
推荐内容