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<User> usersname;
	private HashMap<String,User> usersinfo;
.....
}
class User{.......}  //包含name,password等属性和setName()和setPassword()等方法</span>
运行程序时出现如下错误信息:无法访问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中通过导入使用(如果在同一个包中,无需导入)。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值