2011-02-24 3 views
3

I 얻을 내 자바 코드에 다음과 같은 오류 :이 클래스 응답 공용 클래스가 없습니다 어쩌면 때문에java.lang.IllegalAccessException : 클래스의 public/private 속성과 관련되어 있습니까?

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

+2

이 예외의 원인이되는 코드를 게시 할 수 있습니까? –

+0

Response가 기본 클래스와 동일한 파일에 있어야하는 이유는 무엇입니까? – justkt

답변

5

당신의 클래스를 기억해 두십시오. 응답은 빈 규칙을 따라야합니다 : public이어야하고 public 기본 생성자가 있어야하며 XML에서 참조하는 모든 필드에 대한 setter 및 getter가 있어야합니다.

4

예는 IllegalAccessException documentation이 말한대로입니다.

리플렉션을 사용하여 액세스 한정자를 피할 수 있습니다. 예를 들어 비공개 필드에 액세스하려면 Class.getDeclaredField(String)을 사용하여 특정 Field을 가져옵니다 (비공개 필드에도 사용 - 일반 getField은 공개 멤버 만 가져올 수 있음). Field.setAccessible(true)을 설정합니다. 이제 필드는 공개 된 것처럼 사용할 수 있습니다.

JNI으로 액세스 한정자를 피할 수도 있습니다. 액세스 수정 자에 대해서는 전혀 신경 쓰지 않습니다. 또 다른 방법은 ASM과 같은 도구를 사용하여 사용자 정의 바이트 코드를 생성하는 것입니다.

+0

괜찮아요,하지만 그는 소화조에서 예외를받습니다. 나는 그가 그것을 수정하기를 원한다고 생각하지 않는다. – AlexR

+0

Humm, 사실, 'Response'가 자체 클래스 인 경우 물론, 공개로 문제를 해결해야합니다. –

1

개질제 ""

부재에 클래스 응답의 부재 액세스 할 수없는 것은 수식 public, protected, static ...이며, 인스턴스 변수

Response 클래스에는 apache-commons를 통해 액세스하거나 만들 수없는 필드가 있습니다. digesters ObjectCreationRule.

digiter와 호환되지 않는 Response 클래스가 있거나 Response 클래스를 정의하는 xml 파일 내에 오류가 있습니다. 코드를 보면


- 아니 액세스 수정하는 유일한 자바 "항목은"클래스 ResponseRequest입니다. 어쩌면 오류는 그 클래스가 공개되어야 함을 알려줍니다.

0

ObjectCreateRule 시도는 클래스 이름을 통해 요청로드를 사용하고 Class.newInstance()를 호출합니다. 이것이 작동하려면 Request와 Response 모두 ​​public이 필요하고 public 기본 생성자가 있어야합니다. 1. 요청 및 응답 자신의 소스 파일과 공개 최상위 클래스 내부 그들 공공 2. 둥지 요청 및 응답을하고 public static합니다

는이 두 가지 옵션이 있습니다.

옵션 2를 사용하면 코드가 다음과 같이 보입니다. 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; 
     } 

    } 
} 

다른 사람들이 언급 한 것처럼 직접 리플렉션을 사용하는 경우 액세스 수정자를 피할 수는 있지만이 예에서는 옵션이 아닙니다.

관련 문제