문제

내 내용에 추가하고 싶었어요 jdk6\jre\lib\security\java.policy appengine에 의해 블랙리스트에 추가된 일부 클래스를 생성하려면 금지 명령을 제출하세요.예를 들어, 애플리케이션이 인스턴스화를 시도할 때 로컬 jvm이 예외를 발생시키길 원합니다. javax.naming.NamingException.

것이 가능하다?

여기서는 내 구체적인 문제를 설명하려고 노력할 것입니다.Google은 사용할 수 있는 클래스에 대해 일부 제한이 있는 서비스(GAE-google 앱 엔진)를 제공합니다.예를 들어 javax.naming 패키지에 있는 JNDI 클래스를 인스턴스화하지 않습니다.그들은 또한 내 컴퓨터에서 이 애플리케이션을 테스트하는 데 사용할 수 있는 테스트 서버를 제공하지만 이 서버는 그러한 클래스를 허용하고 코드를 실행할 수 있습니다.당신은 지원서를 구글에 업로드한 후에야 블랙리스트에 등록된 수업을 사용했다는 사실을 알게 되었습니다.개발중인 JVM에서는 이런 클래스 블랙리스트 시행이 불가능하지 않을까 생각하고 있었습니다.그렇지 않으면 이미 그러한 정책 파일을 제공했을 수도 있기 때문에 이것이 쉬울 것이라고 생각합니다.

도움이 되었습니까?

해결책

다음을 생성하는 작은 로더 애플리케이션을 작성할 수 있습니다. 새로운 사용자 정의 클래스 로더.그러면 이 클래스로더를 사용하여 애플리케이션 클래스를 로드할 수 있습니다.

그런 다음 사용자 정의 클래스 로더에서 애플리케이션이 블랙리스트에 추가하려는 클래스에 액세스하려고 할 때 ClassNotFoundException을 발생시킬 수 있습니다.

load() 메서드를 오버로드해야 합니다.이 메소드는 블랙리스트에 있는 클래스에 예외를 발생시키거나 클래스가 허용되는 경우 상위 클래스로더에 위임하는 역할을 합니다.샘플 구현:

public Class loadClass(String name) throws ClassNotFoundException {
    if(name.equals("javax.lang.ClassIDontLike")){
       throw new ClassNotFoundException("I'm sorry, Dave. I'm afraid I can't do that.");
    }
    return super.loadClass(name, false);
}

(물론 실제 구현은 이보다 훨씬 더 복잡할 수 있습니다)

애플리케이션의 클래스는 이 클래스로더를 통해 로드되고 원할 때만 loadClass() 호출을 상위 클래스로더에 위임하기 때문에 필요한 모든 클래스를 블랙리스트에 추가할 수 있습니다.

나는 이것이 Google이 서버에서 클래스를 블랙리스트에 추가하는 데 사용하는 방법이라고 확신합니다.특정 Classloader의 모든 앱을 로드합니다.이는 Tomcat이 다양한 웹 애플리케이션을 격리하는 방식과도 유사합니다.

다른 팁

프로그램을 테스트하는 동안 런타임 오류보다 컴파일 오류가 발생하고 싶지 않습니까?원하지 않는 클래스가 인스턴스화될 때 경고하도록 IDE 또는 컴파일러를 구성할 수 있습니다.AspectJ에는 이에 대한 몇 가지 좋은 기능이 있다는 것을 알고 있습니다.조인 포인트에 대한 컴파일 경고/오류를 정의하고 피드백을 받을 수 있습니다.식.이를 Eclipse에서 사용하려면 AspectJ 플러그인을 설치하고 적절한 측면을 작성하기만 하면 됩니다.명령줄이나 스크립트에서 컴파일하는 동안 오류를 얻으려면 실제로 AspectJ 컴파일러를 사용해야 하지만 그것이 필요할지는 의문입니다.

Java 문서에는 가능한 모든 정책 권한이 여기에 나열되어 있습니다.http://java.sun.com/javase/6/docs/technotes/guides/security/permissions.html

클래스 생성/로드는 언급되지 않았으므로 정책을 사용하여 이를 시행할 수 없다고 생각합니다.

어쨌든 예외 클래스가 로드될 때 예외를 발생시키려는 이유는 무엇입니까?어쩌면 당신이 문제를 설명할 수도 있고, 그러면 누군가가 해결책을 제안할 수도 있습니다.

편집하다:

특정 클래스의 로드를 방지하는 한 가지 방법은 JRE 설치에서 해당 클래스를 제거하는 것입니다.대부분의 시스템 클래스는 JDK/JRE 설치의 rt.jar에 포함되어 있습니다.ZIP 도구를 사용하여 수정할 수 있어야 합니다.

JRE의 특수 설치를 생성하고 해당 rt.jar을 수정하면 됩니다.그것은 추악한 해킹이지만 테스트 목적으로는 괜찮을 것입니다 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top