2011-02-24 69 views
3

我得到了我的Java代码以下错误:java.lang.IllegalAccessException:与公共/私有属性有关吗?

java.lang.IllegalAccessException: Class org.apache.commons.digester.ObjectCreateRule can not access a member of class Response with modifiers "" 

是它也许是因为类的响应不公开课? 如果是这样,我怎样才能使它可访问,并保持与主类相同的文件中的类响应?

感谢

更新,代码:http://www.smipple.net/snippet/aneuryzma/on:%20is%20related%20to%20public%20/%20private%20attribute%20for%20classes%20%3F

+0

你是什么意思,“主类”? – Pointy 2011-02-24 13:31:24

+2

你可以发布导致此异常的代码吗? – 2011-02-24 13:31:59

+0

为什么Response需要与主类在同一个文件中? – justkt 2011-02-24 13:32:01

回答

5

据我记得你的类响应应该遵循bean约定:应该是公共的,应该有公共的默认构造函数,并且应该有你从xml引用的所有字段的setter和getters。

4

是的,作为IllegalAccessException documentation说。

你可以用反射绕过访问修饰符。例如,要访问私人字段,请使用Class.getDeclaredField(String)获取特定的Field(作品也适用于私人字段 - 使用普通getField只能获得公共成员),然后设置Field.setAccessible(true)。现在可以使用该字段,就好像它是公开的。

您也可以用JNI规避访问修饰符。它根本不关心访问修饰符。还有一种方法是使用诸如ASM之类的工具来生成自定义字节码。

+0

这很好,但他从沼气池收到异常。我不相信他想修改它。 – AlexR 2011-02-24 13:36:49

+0

Humm,如果'Response'是自己的班级,当然他可能应该通过公开这个问题来解决问题。 – 2011-02-24 13:38:41

1

不能与改性剂 “”

构件访问类响应的构件是一个实例变量,改性剂是publicprotectedstatic,...

因此,在我看来,Response类有一个无法通过apache-commons-消化器ObjectCreationRule。

要么你有一个Response类与消化器不兼容,或者错误在定义Response类的xml文件中。


看你的代码 - 唯一的Java“项目”,没有访问修饰符的类ResponseRequest。也许错误告诉我们这些类必须是公开的。

0

ObjectCreateRule尝试通过它的类名称使用加载请求,然后调用Class.newInstance()。为此,请求和响应都需要公共并具有公共默认构造函数。

您有这两个选项: 1.将Request和Response在自己的源文件,使您的公众顶级类中予以公布 2.巢请求和响应,使他们public static

如果您选择了两项,那么您的代码如下所示: import java.io.读者; import java.io.StringReader;

import org.apache.commons.digester.Digester; 

public class DigExample { 

    public static void main(String ar[]) { 
     try { 
      Digester digester = new Digester(); 
      digester.setValidating(false); 

      digester.addObjectCreate("response", Response.class); 

      digester.addObjectCreate("response/request", Request.class); 
      digester.addBeanPropertySetter("response/request/name", "name"); 
      digester.addBeanPropertySetter("response/request/value", "value"); 
      digester.addSetNext("response/request", "setRequest"); 

      digester.addBeanPropertySetter("response/matches", "matches"); 

      Reader reader = new StringReader(
          "<?xml version='1.0' encoding='UTF-8'?>" + 
          "<response>" + 
          "<request><name>books</name><value>xml</value></request>" + 
          "<matches>20</matches>" + 
      "</response>"); 
      Response response = (Response)digester.parse(reader); 

      System.out.println(response.toString()); 

     } catch(Exception exc) { 
      exc.printStackTrace(); 
     } 

    } 
    static public class Response { 

     public Response(){} 

     private int _matches = 0; 
     private Request _request; 

     public Request getRequest() { 
      return _request; 
     } 

     public void setRequest(Request request) { 
      _request = request; 
     } 

     public int getMatches() { 
      return _matches; 
     } 

     public void setMatches(int matches) { 
      _matches = matches; 
     } 

    } 



    static public class Request { 

     public Request() {} 

     private String _name = ""; 
     private String _value = ""; 

     public String getName() { 
      return _name; 
     } 

     public void setName(String name) { 
      _name = name; 
     } 

     public String getValue() { 
      return _value; 
     } 

     public void setValue(String value) { 
      _value = value; 
     } 

    } 
} 

正如其他人所提到的,如果你使用反射直接自己,你很可能绕过访问修饰符,但是这不是在你的榜样的选项。