Vererbung Sicherheitslücke? Reflection sieht members, die nicht sichtbar sein sollten?!

guni

Bekanntes Mitglied
Hallo,

folgendes Problem:
Code:
abstract class A {
  private int x;
  public int getX() { return x; }
}

class B extends A {
  private int y;
  public int getY() { return y; }
}

// main
A b = new B()
for (Field f : b.getClass().getDeclaredFields()) {
  System.out.println(f); // ZEIGT private int y an!
}
Warum sehe ich hier y?! M.M. sollten nur die Fields/Methoden der Basisklasse sichtbar sein. Was verstehe ich hier falsch?
 

guni

Bekanntes Mitglied
Hallo Klaus,

danke für deine Antwort. Ich wollte hier aber eigentlich auf ein anderes Problem hinaus:

Mein Object (b) ist gecastet => Es sollte vom Typ A sein.
Trotzdem bin ich über Reflection in der Lage, die Fields aus Typ B zu sehen.

Das sollte m.M. nicht sein.

Meine eigentliche Frage ist wohl:

Wie kann ich sicherstellen, dass die Fields/Methods aus B unsichtbar (auch für die Reflection) sind, sobald b zum Typ A gecastet wird?

mfg, Simon
 

Tobse

Top Contributor
Garnicht; es ist technisch unmöglich. Die Zugriffsregeln in Java sind kein Sicherheitsfeature. Sie sind lediglich dazu da, interne Daten und Funktionen von globalen zu trennen.
 

mrBrown

Super-Moderator
Mitarbeiter
mWn Gar nicht, dein Objekt ist schließlich immer noch vom Typ B, es besitzt noch die Methoden/Felder von B, also sind sie über Reflection auch noch sichtbar.
 

AndyJ

Bekanntes Mitglied
Die anderen haben ja schon drauf hingewiesen: getClass() liefert dir die tatsaechliche Klasse zurueck. Reflection ist ausserdem eine sehr maechtige API, du kannst darueber so ziemlich alles ueber eine Klasse herausfinden. Du kannst private Members sogar accessible machen und einen Wert reinschreiben. Du hast ausserdem getDeclaredFields verwendet, getFields hingegen wuerde dir das erwartete Resultat geben:
Code:
package info.junius.test;

import java.lang.reflect.*;

public class A
{

  private int x;

  public int getX()
  {
  return x;
  }

  public static void main(String[] args)
  {
  A b = new B();
   
  System.out.println("Klasse: " + b.getClass()); // ist typ B!
   
  System.out.println("zeige alles:");
  // zeigt dir alles an, was in B declared ist
  for (Field f : b.getClass().getDeclaredFields())
  {
  System.out.println(f); // ZEIGT private int y an!
  }

  System.out.println("zeige nur public Fields:");
  // zeigt nur public members an
  for (Field f : b.getClass().getFields())
  {
  System.out.println(f);
  }
   
  }

  static class B extends A
  {
  private int y;

  public int getY()
  {
  return y;
  }
  }

}
 

guni

Bekanntes Mitglied
@AndyJ: danke für den Hinweis mit getFields statt getDeclaredFields. Mir ging es allerdings nicht darum, die Methode zu finden, die mir nur die "richtigen" Members zeigt; ich wollte eher ausschließen, dass es irgendeinen Weg gibt, mir die Daten anzeigen zu lassen, die an dieser Stelle nicht sichtbar sein sollten.

Noch eine Sache: du schreibst

getClass() liefert dir die tatsaechliche Klasse zurueck.

Warum ist meine __tatsächliche__ Klasse nach dem Cast nicht die, in die ich gecastet hab?

@all: vielen Dank für eure Antworten. Schade dass das nicht geht. C# scheint - was ich gehört habe - an dieser Stelle "strenger" zu sein. Fällt jemand eine andere Lösung ein das obenstehende Problem umzusetzen? So, dass nichtmal Reflection in der Lage ist auf Dinge zuzugreifen, die an dieser Stelle eigentlich nicht sichtbar sein sollten?
 

InfectedBytes

Top Contributor
Das Objekt selber bleibt vollkommen unverändert durch einen cast. Du änderst ja nur den Typ deiner Variable.

@all: vielen Dank für eure Antworten. Schade dass das nicht geht. C# scheint - was ich gehört habe - an dieser Stelle "strenger" zu sein.
Nein, das ist bei C# genauso.
Das ist nunmal auch der Sinn von Reflection, damit können zur Laufzeit sämtliche Informationen über ein Objekt abgefragt (und geändert) werden.
 

Meniskusschaden

Top Contributor
Wir profitieren ja auch regelmäßig davon, beispielsweise wenn wir den Debugger oder ContentAssist-Funktionen der IDE nutzen. Das wäre bestimmt viel schwieriger zu programmieren, wenn man per Reflection nur begrenzten Zugriff hätte.
 

mrBrown

Super-Moderator
Mitarbeiter
@AndyJ: danke für den Hinweis mit getFields statt getDeclaredFields. Mir ging es allerdings nicht darum, die Methode zu finden, die mir nur die "richtigen" Members zeigt; ich wollte eher ausschließen, dass es irgendeinen Weg gibt, mir die Daten anzeigen zu lassen, die an dieser Stelle nicht sichtbar sein sollten.

Was ist denn überhaupt dein Zeil? Vllt gibt es andere Wege, das zu erreichen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Sicherheitslücke beheben & Email per Java? Java Basics - Anfänger-Themen 38
I Reflection: Suche Feld + in Unterklassen Java Basics - Anfänger-Themen 7
B Reflection ändern von Objekten in Objekten Java Basics - Anfänger-Themen 12
S reflection und felder Java Basics - Anfänger-Themen 12
B .class-File mit Reflection auslesen Java Basics - Anfänger-Themen 8
X Parameterübergabe per Reflection Java Basics - Anfänger-Themen 10
U Reflection Benutzung Java Basics - Anfänger-Themen 2
J Reflection Java Basics - Anfänger-Themen 6
B Reflection Java Basics - Anfänger-Themen 8
S Datentypen Reflection Cast anhand eines Strings? Java Basics - Anfänger-Themen 7
X reflection api Java Basics - Anfänger-Themen 5
R Alle Klassen ermitteln, die Interface implementieren / Reflection Java Basics - Anfänger-Themen 51
lumo java reflection Java Basics - Anfänger-Themen 7
J Reflection Java Basics - Anfänger-Themen 2
J Reflection Java Basics - Anfänger-Themen 3
P Reflection - Class Not Found Exception Java Basics - Anfänger-Themen 3
A Frage zu Reflection Java Basics - Anfänger-Themen 8
A abgeleitete Klassen mit Reflection holen Java Basics - Anfänger-Themen 2
M Reflection Java Basics - Anfänger-Themen 8
W Problem bezüglich reflection Java Basics - Anfänger-Themen 11
S verschiede constructoren über reflection Java Basics - Anfänger-Themen 3
V Reflection API - getter und setter Java Basics - Anfänger-Themen 7
JFeel-x Frage zu reflection Java Basics - Anfänger-Themen 12
J Reflection Basic Java Basics - Anfänger-Themen 26
C Reflection Exceptions behandeln Java Basics - Anfänger-Themen 6
T von Reflection zum Thread? Java Basics - Anfänger-Themen 5
G Vorteile Reflection bezüglich MVC-Pattern Java Basics - Anfänger-Themen 9
G Reflection - Klasse laden aus anderem Verzeichnis Java Basics - Anfänger-Themen 4
L Reflection-fehlermeldung Java Basics - Anfänger-Themen 12
E Klassenaufrufe dynamisch mit Reflection Java Basics - Anfänger-Themen 4
S wer oder was ist reflection? Java Basics - Anfänger-Themen 11
T Getter/Setter - wie sieht ein Setter aus? Und wie nicht? Java Basics - Anfänger-Themen 34
berserkerdq2 Findet eine parallele Verarbeitung in Java bei Threads erst statt, wenn man die Methoden auch synchronized? Und wie sieht bei Conditions aus? Java Basics - Anfänger-Themen 8
I Java Programm sieht wie exe aus. Java Basics - Anfänger-Themen 3
B Wie sieht die Formel für eine Rechtecksschwingung aus? Java Basics - Anfänger-Themen 5
M JButton sieht komisch aus :-) Java Basics - Anfänger-Themen 5
G Problem mit Zeichen Zeilenumbruch sieht aus wie(Eckige Null) Java Basics - Anfänger-Themen 4
T Wie sieht ein '.' im regulären Ausdruck aus? Java Basics - Anfänger-Themen 2
T JEditorPane und Stylesheet.sieht komisch aus. Java Basics - Anfänger-Themen 6
G Compiler sieht die Bedingung nicht! Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben