@Override
public String intercept(ActionInvocation ai) throws Exception {
Object action = ai.getAction();
System.out.println(action.getClass());//------------------------------------为什么此处得到的action名为com.accp.oa.web.action.LoginAction$$EnhancerByCGLIB$$9d32546b ,这个类名后面的是什么啊,怎么多了个这个 Field verifycodeField=action.getClass().getDeclaredField("type");
verifycodeField.setAccessible(true);
}struts
cglib代理类
怎么解决这个问题,我以前写的时候怎么没有后面这个
现在只要这个com.accp.oa.web.action.LoginAction 怎么改
可以这样用:
action.getInvocationContext.getXXX,后面有各种方法
我把以前的项目拿出来运行了下,一摸一样写法,得到的应该是完整的包名加类名,现在怎么多了后面这个$$...这是什么原因导致的
下面是api说明
Object
public Object()
Method Detail getClass
public final Class<?> getClass()
Returns the runtime class of this Object. The returned Class object is the object that is locked by static synchronized methods of the represented class.
The actual result type is Class<? extends |X|> where |X| is the erasure of the static type of the expression on which getClass is called. For example, no cast is required in this code fragment:Number n = 0;
Class<? extends Number> c = n.getClass();
Returns:
The Class object that represents the runtime class of this object.
See Also:
The Java Language Specification, Third Edition (15.8.2 Class Literals)
这个看不太懂
能不能给我讲解下,我在书上看的,因为我后面要通过这个action的名字去获取里面的字段和方法,名字错了的话,后面根本拿不到。。
万分感谢!!!
使用ai.getProxy().getConfig().getClassName()从代理的配置中获取实际的类。
你的invoction 是ActionInvocation 对象么
在类没有被代理的情况下,你所获得的是一个全路径实体,要是被cglib代理了,那就是cglib代理实体,$$后面的你可以视为代理唯一标识。
如果你想用getClass()的方式获取类名,就调用实体的getName()方法:invocation.getAction().getClass().getName()。
另外,我的肯定是ActionInvocation的实例,实现了struts2拦截器接口的类,不会乱传的。
最后,觉悟吧,骚年
这个不弄好,没心思吃饭啊,对了,
刚忘了说,我前面都是用注解写的,而且整合了ssh,刚刚我单独用struts2写了一遍,发现没问题,整合了ssh再加注解,就出现这问题了,而且我刚用invocation.getAction().getClass().getName()后面还是带$$...这个,这什么原因啊
委托给spring以后启用cglib代理了,所以会有$$。
String className = "com.accp.oa.web.action.LoginAction$$EnhancerByCGLIB$$9d32546b ";
System.out.println(className.split("\\${2}")[0]);
split函数里的是正则表达式,两个连续$的意思。
我想你对cglib的理解还是有所偏差的,首先你说的没错,这是一种类增强,但是cglib的增强对象(Enhancer)正是用来设置被代理类的类。通过在增强类中配置需被代理类后,cglib会生成形如:com.accp.oa.web.action.LoginAction$$EnhancerByCGLIB$$9d32546b 形式的代理类,$$最前面是原始全路径类名,中间是对于生成代理的类的一种声明,由CGLIB的Enhancer来实现,然后最后是一个唯一标识,保证整个代理类名是唯一的。
所以不是像你说的那样$$EnhancerByCGLIB$$9d32546b是一个增强类,它是一个代理类名整体的一部分罢了。
if(rand.equals(verifycode)){
ai.invoke();
}
//-------------
ActionContext.getContext().put("msg", "验证码错误!");
return "login";
假如我现在上面的if判断为true,执行了ai.invoke();下面进入action了,最后会不会回来继续执行------下面的代码?
我的疑问是,它不是递归执行的么,ai.invoke()是去执行下个拦截器,如果有下个拦截器的话,没有return,就继续执行,有return 就停掉了是不是这样理解的。。
首先,如果为true了,也是会执行下面的方法的,骚年,ai.invoke();仅仅是一个字符串而已,除非写成return ai.invoke();下面才不会执行。
public String intercept1()
{
public String intercept2()
{
public String intercept3()
{
public String intercept...()
{
public String action方法()
{
return str;
} }
}
}
}
或者,在中间某个拦截器收你控制返回,那么不会最终执行action的方法。