jdk静态代理
局限性: 只能代理某一类型接口的实例,不能代理任意接口任意方法
静态代理只能代理固定或单一的方法,也就是说不能做到任何类任何方法的代理
jdk动态代理
jdk动态代理灵活性很大,在任何地方都可以使用代理功能,前提是该对象有实现接口
/*InvocationHandler接口中声明了一个invoke方法,invoke方法是实际进行业务增强处理*/
public class MyHandler implements InvocationHandler {
/**声明被代理对象*/
private Object target;
public MyHandler() {
}
public MyHandler(Object target) {
this.target = target;
}
/**获取代理对象*/
public Object getProxyInstance(){
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),this);
}
/**
* 通过invoke方法进行业务增强操作
* proxy: 动态生成的代理对象实例
* method: 被代理对象当前正在执行的业务方法
* args: 被代理对象当前正在执行的业务方法中的参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("=====获取数据连接=====");
method.invoke(target, args);
System.out.println("=====关闭连接=====");
return null;
}
}
public interface Mapper {
void jdbcOperator();
}
public class UserMapper implements Mapper {
public void jdbcOperator(){
System.out.println("====执行核心业务代码UserMapper====");
}
}
public static void main(String[] args) {
UserMapper userMapper = new UserMapper();
MyHandler myHandler = new MyHandler(userMapper);
Mapper proxyInstance =
(Mapper) myHandler.getProxyInstance(); //代理对象只能用接口去接
proxyInstance.jdbcOperator();
// System.out.println("--------分割线---------");
// SMapper sMapper = new SMapper();
// myHandler = new MyHandler(sMapper);
// AdminMapper mapper = (AdminMapper) myHandler.getProxyInstance();
// mapper.jdbcOperator();
TestProxyClass.creatClassFile("$Proxy0", Mapper.class);
}
public class TestProxyClass {
public static void creatClassFile(String proxyName,Class clazz) {
byte[] ClassFile = ProxyGenerator.generateProxyClass(proxyName, new Class[]{clazz});
String path = "D:\\IDEA_Workspace\\cgb2107_stage3\\proxyapp\\target\\classes\\cn\\tedu\\util\\";
System.out.println("path"+path);
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(path + proxyName + ".class");
fileOutputStream.write(ClassFile);
fileOutputStream.flush();
} catch (Exception e) {
e.printStackTrace();
}finally {
if (fileOutputStream!=null){
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}