在目前的Java开发包中包含了对动态代理的支持,但是其实现只支持对接口的的实现。
其实现主要通过是java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。
Proxy类主要用来获取动态代理对象,InvocationHandler接口用来约束调用者实现
业务接口
package com.itmyhome.manager;
public interface UserManager {
public void addUser(); //增加用户
public boolean delUser(int id); //删除用户
}
业务接口实现
package com.itmyhome.manager;
//UserManager接口的实现类
public class UserManagerImpl implements UserManager {
@Override
public void addUser() {
// TODO Auto-generated method stub
System.out.println("--addUser()--");
}
@Override
public boolean delUser(int id) {
// TODO Auto-generated method stub
System.out.println("--delUser()--");
return true;
}
}
InvocationHandler实现 测试在调用接口方法前输出一行代码
package com.itmyhome.manager;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyHandler implements InvocationHandler {
private Object obj; //要代理的对象
public Object createProxy(Object obj){ //创建代理
this.obj = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),
this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable { //具体的处理策略 根据方法名判断
// TODO Auto-generated method stub
check();
Object temp = method.invoke(this.obj, args);
return temp;
}
public void check(){
System.out.println("---check()---");
}
}
测试代码
package com.itmyhome.manager;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ProxyHandler handler = new ProxyHandler();
UserManager userManager = (UserManager)handler.createProxy(new UserManagerImpl());
userManager.addUser();
userManager.delUser(1);
}
}