1.先建一个接口
package com.dafy.accountbusiness.jdkproxy;
public interface UserService {
String findUser(String[] arr);
}
2.再建一个接口实现类
package com.dafy.accountbusiness.jdkproxy;
public class UserServiceImpl implements UserService {
@Override
public String findUser(String[] arr) {
System.out.println("-----------执行查询---------");
return "返回查询结果";
}
}
3.然后实现 InvocationHandler接口,设置关注点
package com.dafy.accountbusiness.jdkproxy;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import sun.misc.ProxyGenerator;
public class SecurityHandler implements InvocationHandler {
// 目标类
private Object target;
public SecurityHandler(Object target){
this.target=target;
}
/**
* 获取目标对象的代理对象
* @return 代理对象
*/
public Object SecurityProxy(){
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
/*
* 调用代理方法
*/
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
// 在目标对象的方法执行之前
securityBefore(method);
// 执行目标对象的方法 , 这里应该还有对异常的处理
Object result = method.invoke(target, args);
// 在目标对象的方法执行之后
securityAfter(method);
return result;
}
public void securityBefore(Method m) {
System.out.println("------------before------------调用"+m.getName()+"方法前执行");
}
public void securityAfter(Method m) {
System.out.println("------------after------------调用"+m.getName()+"方法后执行");
}
}
public static void main(String[] args) {
// 实例化目标对象
UserService userService=new UserServiceImpl();
// 实例化InvocationHandler
SecurityHandler securityHandler=new SecurityHandler(userService);
// 根据目标对象生成代理对象
UserService userServiceProxy=(UserService)securityHandler.SecurityProxy();
// 调用代理对象的方法
userServiceProxy.findUser(null);
//生成代理类字节码文件
ProxyGeneratorUtils.writeProxyClassToHardDisk("D:/$Proxy11.class");
}
至此JDK动态代理的使用完成
这个可以生成这个代理类的字节码文件,有兴趣可以看看JDK动态代理的原理
class ProxyGeneratorUtils {
/**
* 把代理类的字节码写到硬盘上
* @param path 保存路径
*/
public static void writeProxyClassToHardDisk(String path) {
// 第一种方法
// System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", true);
// 第二种方法
// 获取代理类的字节码
byte[] classFile = ProxyGenerator.generateProxyClass("$Proxy11", UserServiceImpl.class.getInterfaces());
FileOutputStream out = null;
try {
out = new FileOutputStream(path);
out.write(classFile);
out.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}