最近在咕泡学院学习JDK动态代理时,看到老师有教手写JDK动态代理实现。由于课堂时间有限,老师讲的一些地方不够完善。自己后期进行了如下修改。
- 支持对有参数的方法进行代理。
- 添加了缩进。生成代理类Java文件更加美观。
- 整个生成代理类Java文件的过程都是动态生成的。
代码如下:
XLInvocationHandler
package com.gupao.proxy.custom;
import java.lang.reflect.Method;
/**
* <p>Title: XLInvocationHandler.java</p>
* <p>Description: 自定义InvocationHandler</p>
* <p>Copyright: Copyright (c) 2019</p>
* <p>Company: </p>
*
* @author 树林里面丢了鞋
* @version 1.0
* @date 2019/2/12
*/
public interface XLInvocationHandler {
Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
}
XLClassLoader
package com.gupao.proxy.custom;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
/**
* <p>Title: XLClassLoader.java</p>
* <p>Description: 自定义ClassLoader</p>
* <p>Copyright: Copyright (c) 2019</p>
* <p>Company: </p>
*
* @author 树林里面丢了鞋
* @version 1.0
* @date 2019/2/12
*/
public class XLClassLoader extends ClassLoader{
private File classPathFile = new File(XLClassLoader.class.getResource("").getPath());
public XLClassLoader() {}
@Override
protected Class<?> findClass(String name) {
String className = XLClassLoader.class.getPackage().getName() + "." + name;
if (classPathFile != null) {
File classFile = new File(classPathFile, name.replaceAll("\\.", "/") + ".class");
if (classFile.exists()) {
FileInputStream fis = null;
ByteArrayOutputStream bos = null;
try {
fis = new FileInputStream(classFile);
bos = new ByteArrayOutputStream();
byte[] buff = new byte[1024];
int len;
while ((len = fis.read(buff)) != -1) {
bos.write(buff, 0, len);
}
return defineClass(className, bos.toByteArray(), 0, bos.size());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != fis) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != bos) {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();