1.Proxy.newProxyInstance(ClassLoader loader, Class< ?>[] interfaces, InvocationHandler h)
参数:
loader - 定义代理类的类加载器
interfaces - 代理类要实现的接口列表
h - 指派方法调用的调用处理程序
返回:
一个带有代理类的指定调用处理程序的代理实例,它由指定的类加载器定义,并实现指定的接口
理解:返回y一个实现接口的代理类 Userdao userdao =new UserdaoImpl();
2.InvocationHandler接口的invoke(Object proxy, Method method, Object[] args)方法
invoke(Object proxy, Method method, Object[] args)在代理实例上处理方法调用并返回结果。在与方法关联的代理实例上调用方法时,将在调用处理程序上调用此方法
参数:
proxy : 在其上调用方法的代理实例
method : 对应于在代理实例上调用的接口方法的 Method 实例。Method 对象的声明类将是在其中声明方法的接口,该接口可以是代理类赖以继承方法的代理接口的超接口。
args : 包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为 null。基本类型的参数被包装在适当基本包装器类(如 java.lang.Integer 或 java.lang.Boolean)的实例中。
返回值:从代理实例的方法 -调用返回的值
实现动态代理的代码如下:
代理的接口
public interface UserDao {
public abstract void login();
public abstract void regist();
}
代理的接口实现
public class UserDaoImpl implements UserDao {
@Override
public void login() {
System.out.println("登录功能");
}
@Override
public void regist() {
System.out.println("注册功能");
}
}
关联的调用处理程序
public class MyInvocationHandler implements InvocationHandler {
private Object target;
private MyInvocationHandler() {
}
public MyInvocationHandler(Object target) {
this.target = target;
}
//invoke(Object proxy, Method method, Object[] args)
//在代理实例上处理方法调用并返回结果。在与方法关联的代理实例上调用方法时,将在调用处理程序上调用此方法
//proxy - 在其上调用方法的代理实例
//method - 对应于在代理实例上调用的接口方法的 Method 实例。Method 对象的声明类将是在其中声明方法的接口,该接口可以是代理类赖以继承方法的代理接口的超接口。
//args - 包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为 null。基本类型的参数被包装在适当基本包装器类(如 java.lang.Integer 或 java.lang.Boolean)的实例中。
//返回值:从代理实例的方法 -调用返回的值
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("调用方法前执行的操作");
//执行实例化target的method方法,方法参数args,方法返回值result
Object result=method.invoke(target, args);
System.out.println("调用方法后执行的操作");
return result;
}
测试:
public class Test {
/**.Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
* loader - 定义代理类的类加载器
*interfaces - 代理类要实现的接口列表
*h - 指派方法调用的调用处理程序
*返回:
*一个带有代理类的指定调用处理程序的代理实例,它由指定的类加载器定义,并实现指定的接口
*
*/
public static void main(String[] args) {
UserDao sd=new UserDaoImpl();
MyInvocationHandler h=new MyInvocationHandler(sd);
UserDao sdo=(UserDao)Proxy.newProxyInstance(sd.getClass().getClassLoader(), sd.getClass().getInterfaces(), h);
sdo.login();
sdo.regist();
}
}
输出:
调用方法前执行的操作
登录功能
调用方法后执行的操作
调用方法前执行的操作
注册功能
调用方法后执行的操作