Java-Struts2:Can not access a member of class with modifiers "public"

现象:

这是我在学习Struts类型转换器的过程中遇到的问题。

在同一个类文件中定义了两个类,其中TypeConvAction是主类,包含了一个User类型的用户信息,这个类是自己定义的。由于在同一个类文件中只能有一个public类,所以User为默认可见性(包可见性)

//in package com.neo.struts.ch4p1
public class TypeConvAction extends ActionSupport {
	private User user;
	private List usersname;
	private HashMap usersinfo;
.....
}
class User{.......}  //包含name,password等属性和setName()和setPassword()等方法
运行程序时出现如下错误信息:无法访问User类

..........
java.lang.IllegalAccessException: Class com.opensymphony.xwork2.ObjectFactory can not access a member of class com.neo.struts.ch4p1.User with modifiers "public">
...........


原因:

通过反射机制进行创建实例和方法调用,在MVC框架中是非常普遍的。例如,在本例的struts2应用中,当响应客户端的action请求时,需要通过反射机制创建User实例,并且通过反射机制的方法调用来对User实例进行属性设置,比如调用user的setName(),setPassword()方法,以用于对请求参数进行封装。但是,反射机制的应用必须要求该类是public访问权限的。有朋友可能会说,可以调用setAccessible(true)方式来改变可见性,但这是一个概念混淆导致的错误。setAccessible(true)函数是反射机制用于改变类内属性访问权限的,而不是改变类本身的可见性。例如,在下面的类中,可以通过反射机制,调用setAccessible(true),使得private属性x被访问:

public class Test {
    private int x;
    .......
}



解决方案:

另建一个User.java文件,将User作为public class,在TypeConvAction中通过导入使用(如果在同一个包中,无需导入)。



你可能感兴趣的:(Java)