接口:public interface IUserService { public abstract void save(); public abstract void delete(); public abstract boolean isFlag();}
类:public class UserService implements IUserService {
private boolean flag;

public boolean isFlag() {
return this.flag;
} public UserService() {
}

public UserService(boolean flag){
this.flag = flag;
}

public void save(){
System.out.println("这是save()方法");
}

public void delete(){
System.out.println("这是delete()方法");
}
}
代理类:public class DynamicProxy { private Object target; public Object getObject(Object obj){
this.target = obj;
return Proxy.newProxyInstance(this.getClass().getClassLoader(), 
this.target.getClass().getInterfaces(), new InvocationHandler(){
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
IUserService service = (IUserService) DynamicProxy.this.target;
if(service.isFlag()){
return method.invoke(target, args);
}
return null;
}
});
}
}
测试类:
public class AopJunit { @BeforeClass
public static void setUpBeforeClass() throws Exception {
} @Test
public void aop(){
DynamicProxy proxy = new DynamicProxy();
IUserService service1 = (IUserService) proxy.getObject(new UserService(false));
System.out.println(service1.isFlag());   //此处会报空指什,为什么???③
IUserService service2 = (IUserService) proxy.getObject(new UserService(true));
System.out.println(service2.isFlag());
service1.save();  //①
service2.save();  //②
}
}
问题:
1.③处为何报空指针异常?
2.①处同样执行了save方法,这是为什么?
  经过测试发现:无论我new了多少个实例,实际存在的就只有一个实例,是否动态代理类只生成一个实例?

解决方案 »

  1.   

    晕,总算明白了,自问自答吧.
    1.当service.isFlag() = false时,返回对象为null,所以会报NullPointException.
    2.因为Proxy.newInstance()为static方法,所以能够让代理类初始化成功的只有最后一次初始化.总结:应加强分析,简单问题发贴是浪费资源!!!
      

  2.   

    Proxy.newInstance()为static方法,所以能够让代理类初始化成功的只有最后一次初始化. 
    学习了 看来要细心哦
      

  3.   

    to sunndown:不好意思了,呵呵.分照给to SimonYeung:是啊,一不小心就错了.