概念性的东西本人就不必讲了。现在本人就直接拿源码说明:
有两个业务类。














其中有一个业务需要上面这两个类来完成这个业务,而且完成这个业务,还要根据用户是什么样的角色。如果这个角色假设是"1"做什么,其它的做什么。下面这个类是具体业务的实现。






























具体业务的接口如下:
public
interface
ServiceInterface {
public void businessMethod() throws Exception;
}
public void businessMethod() throws Exception;
}
动态代理,主要功能是代理业务实现类即Service
public
class
ProxyObserver
implements
InvocationHandler {
private Object orgin ;
public ProxyObserver(Object orgin){
this .orgin = orgin ;
}
@SuppressWarnings( " unchecked " )
public Object proxy() {
return Proxy.newProxyInstance(orgin.getClass().getClassLoader(),
orgin.getClass().getInterfaces(), this );
}
public Object invoke(Object arg0, Method arg1, Object[] arg2)
throws Throwable {
// TODO Auto-generated method stub
if (arg1.getName() == " businessMethod " ) {
System.out.println(arg1.getName());
}
return arg1.invoke(orgin, arg2);
}
}
private Object orgin ;
public ProxyObserver(Object orgin){
this .orgin = orgin ;
}
@SuppressWarnings( " unchecked " )
public Object proxy() {
return Proxy.newProxyInstance(orgin.getClass().getClassLoader(),
orgin.getClass().getInterfaces(), this );
}
public Object invoke(Object arg0, Method arg1, Object[] arg2)
throws Throwable {
// TODO Auto-generated method stub
if (arg1.getName() == " businessMethod " ) {
System.out.println(arg1.getName());
}
return arg1.invoke(orgin, arg2);
}
}
下面进行一下测试,用户User类其中有一个属性为markcode是存管理员分配的相应的权限,在这里读者可以任意设置。可以控制方法的执行。
public
static
void
main(String[] args) {
// Observer
UserObersered userOber = new UserObersered();
Service service = new Service();
userOber.addObserver(service);
User user = new User();
String[] markcode = { " 2 " };
user.setMarkcode(markcode);
userOber.codeChange(user);
ProxyObserver proxyUserWatcher = new ProxyObserver(service);
Object proxy = proxyUserWatcher.proxy();
try {
((ServiceInterface)proxy).businessMethod();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// Observer
UserObersered userOber = new UserObersered();
Service service = new Service();
userOber.addObserver(service);
User user = new User();
String[] markcode = { " 2 " };
user.setMarkcode(markcode);
userOber.codeChange(user);
ProxyObserver proxyUserWatcher = new ProxyObserver(service);
Object proxy = proxyUserWatcher.proxy();
try {
((ServiceInterface)proxy).businessMethod();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}