2016-11-18 3 views
2
othersMap.put("maskedPan", Class.forName("Some Class")); 

Entfernen Sie diese Verwendung des dynamischen Klassenladens.Wie kann diese Verwendung des dynamischen Klassenladens entfernt oder das Laden dieser Klasse ersetzt werden?

Regel

Changelog Klassen nicht geladen dynamisch durch eine statische Klasseninitialisierer ausgeführt dynamisch geladene Klassen bösartigen Code enthalten können werden sollen. I.E. Sie müssen Methoden für solche Klassen nicht einmal instanziieren oder explizit aufrufen, um für einen Angriff anfällig zu sein. Diese Regel wirft ein Problem für jede Verwendung des dynamischen Klassenladens auf. Nicht kompatibel Codebeispiel

String className = System.getProperty("messageClassName"); 
Class clazz = Class.forName(className); // Noncompliant 

Siehe

+0

Sie sollten beschreiben, was Sie tun möchten; Warum ist die dynamische Belastung überhaupt vorhanden? –

+1

weil das die Voraussetzung ist. Oder Sie können sagen, dynamisches Laden für die Laufzeit verwendet, aber beim Testen in SONAR fängt es die Ausnahme. Wie das zu lösen ist habe ich mit statisch versucht aber nicht lösen können. Bitte helfen wird geschätzt. –

+0

Warum hat dies den Javascript-Tag? –

Antwort

1

Eine Möglichkeit etwas wie das sein würde:

Class<?> cls; 

switch (System.getProperty("messageClassName")){ 
    case "com.example.Message1": 
    cls = com.example.Message1.class; 
    break; 
... 
} 
+0

Es funktioniert oder nicht? @ k5_ was weiß ich Klassenname nicht. Es wird mir vom Benutzer zur Verfügung gestellt und es gibt 100 Klassen. – Nitul

0

Nun, Sie könnten versuchen, die Sonar Regel auszutricksen, z.B. durch Reflexion mit der Class.forName() Methode aufrufen, aber ich fühle mich Ihnen würde das falsche Problem dort zu lösen:

Class.class.getDeclaredMethod("forName", String.class).invoke(null, className); 

Der richtige Weg, es zu tun ist, um die Menschen zu überzeugen, entweder die Sonar laufen in Ihrem org dass das, was Sie tun, ist notwendig und sie müssen für Sie eine Ausnahme von der Regel machen. Oder wenn du sie nicht überzeugen kannst, hör auf damit.

+0

Wird versuchen, Sie wissen zu lassen, ob SONAR jetzt erkennt oder nicht. Hier ist der Klassenname endlich? : 'String className = System.getProperty (" messageClassName ");' –

+1

Warum verwenden Sie 'String.class' können Sie bitte erklären, beantworten Sie ein wenig? Wie dies ersetzt meine' class.forname' Bitte. –

Verwandte Themen