动态代理:
在程序运行过程中产生的这个对象;运行特点:在程序的执行过程中,通过一个类Proxy和接口invacationHandler(处理程序)实现动态代理;
Proxy类中的方法创建动态代理类对象:
public static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h);
InvocationHandler接口:
Object invoke(Object proxy,Method method,Object[] args);
参数1:loader类加载器 public ClassLoader getClassLoader():返回该类的类加载器;
参数2:public Class[] getInterfaces():如果此对象表示一个类,则返回一个数组,它包含了该类所实现的所有接口的对象;
举例:
提供一个针对用户操作的接口:
package org.westos_test3;
/**
*
* 针对用户操作的接口
* 提供了增删改查的方法
*
*/
public interface UserDao {
public abstract void add() ;//增加
public abstract void delete() ;//删除
public abstract void update() ;//修改
public abstract void find() ;//查询
}
实现UserDao接口:
package org.westos_test3;
//ssh 老框架
public class UserDaoImpl implements UserDao {
@Override
public void add() {
System.out.println("调用了增加功能");
}
@Override
public void delete() {
System.out.println("调用了删除功能");
}
@Override
public void update() {
System.out.println("调用了修改功能");
}
@Override
public void find() {
System.out.println("调用了查询功能");
}
}
代理的类:
package org.westos_test3;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyInvocationHandler implements InvocationHandler {
//给哪个对象生成代理 (目标对象)
private Object target ;
public MyInvocationHandler(Object target) {
this.target = target ;
}
@Override
//proxy:在其上调用方法的代理实例;
//method:当前底层实现的方法;
//args:参数,传入的是对象的数组;
//返回值类型为:Object;
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//实现代理的程序
System.out.println("权限校验");
Object obj = method.invoke(target, args) ;//给target进行代理;
System.out.println("日志记录");
return obj;//返回的就是代理对象
}
}
测试类:
package org.westos_test3;
import java.lang.reflect.Proxy;
/**
* 动态代理的测试类;
*
*/
public class Test {
public static void main(String[] args) {
// 创建UserDao对象
UserDao ud = new UserDaoImpl();
ud.add();
ud.delete();
ud.update();
ud.find();
System.out.println("------------------");
// 针对UserDao对象ud给它生产一个代理对象
// 调用处理程序,接口实现类中产生代理
MyInvocationHandler handler = new MyInvocationHandler(ud);
UserDao ud2 = (UserDao) Proxy.newProxyInstance(ud.getClass().getClassLoader(),ud.getClass().getInterfaces(),handler);
ud2.add();
ud2.delete();
ud2.update();
ud2.find();
}
}