接口: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了多少个实例,实际存在的就只有一个实例,是否动态代理类只生成一个实例?
类: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了多少个实例,实际存在的就只有一个实例,是否动态代理类只生成一个实例?
解决方案 »
- 关于一个代码出错的问题
- StringBuilder为什么无法append进去指定的内容?
- 单击按钮【检测】弹出窗口,窗口中有文本框和标签,以及另外添加的一个按钮【确定提交】,如何才能使填写完文本框的数据后,点击【确定提交】按钮,先实现对数据的检测,如果数据符合要求则弹出【谢谢合作】的消息框,具体要求如下:。。。谢谢
- java连接oracle数据库出现的问题!
- c++ java 运算符
- 如何在Eclipes中开发j2se程序,新人,别见笑,有经验的多指点
- [请教]关于汉字(HZ)编码的介绍,或者注意点!!!
- 〓〓〓〓〓欢迎大家讨论传统文化和红楼梦!〓〓〓〓〓
- 如何用random取0到0.1之间的随机值?
- 请问在JAVA中获取一个对象名称,用什么方法,不是getName,急!在线等待
- 关于Class.forName、Class.class(属性)、getClass()的问题
- 请问如何通过socket向C++的程序传送一个结构体
1.当service.isFlag() = false时,返回对象为null,所以会报NullPointException.
2.因为Proxy.newInstance()为static方法,所以能够让代理类初始化成功的只有最后一次初始化.总结:应加强分析,简单问题发贴是浪费资源!!!
学习了 看来要细心哦