Reflection - Bug??



  • hi,ich habe eine frage, habe mich jetzt kurz mit reflection befasst, d.h ich rufe eine Methode über Reflection zur laufzeit auf, diese methode(methoden) sind in meinem fall einmal private static und einmal (also instanc-methode)private.
    Ich benutze "reflection" in einer TestClasse und siehe da ich kann eine private methode aufrufen obwohl ich diese methode nicht innerhalb der klasse aufrufe sondern in einer anderen klasse. wieso funktioniert das?? gerade private sollte doch dafür sorgen das man die methode(n) nur innerhalb der klasse aufrufen kann in der sie definiert ist, somit kann man doch jegliches "sicherheitskonzept" unterlaufen.
    Ich hoffe ihr versteht was ich meine!!

    code

    //TestClasse
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace MyProject {
    
        public class HeadClass {//TestClasse
    
            private void Test() {
                Console.WriteLine("TestHeadClass");
            }
    
            private static int Test2(int a) {
                return a * 3;
            }
        }
    }
    
    namespace MyProject {
    
        public class MainClass {
    
          public static void Main(string[] args) {
                new MainClass().testInstanceReflection();
           }
    
           public void testInstanceReflection() {
                Type type = Type.GetType("MyProject.HeadClass");//Klasse wo sich Methode befindet
                MethodInfo minfo = type.GetMethod("Test", BindingFlags.Public |  BindingFlags.NonPublic | BindingFlags.Instance);
                Object theObject = Activator.CreateInstance(type);//Instanz der Klasse erstellen
                Object returnValue = minfo.Invoke(theObject, null);//Methode aufrufen
            }
    
            public void testStaticReflection() {
                Type type = Type.GetType("MyProject.HeadClass");
                Type[] types = new Type[1];
                types[0] = Type.GetType("System.Int32");//Typ des Parameters
                MethodInfo minfo = type.GetMethod("Test2", BindingFlags.NonPublic | BindingFlags.Static, null, types, null); //Name der Methode,Zugriffsspezifikation,null,types,null
                Object[] parameters = new Object[1];
                parameters[0] = 5; //Parameter für Methode
                Object returnValue = minfo.Invoke(type, parameters);//Rückgabewert
                Console.WriteLine(returnValue);//Ausgabe
            }
    


  • das ist kein bug; das ist eine weitere funktion von reflection. was dein sog. sicherheitskonzept betrifft: ein normaler programmierer verwendet eine derartige konstruktion aüsserst selten. dazu kommt, dass es theoretisch auch ohne reflection möglich ist eine private methode von ausserhalb aufzurufen. es ist vielleicht vergleichbar mit dem schlüsselwort const in c++: du darfst nichts verändern, aber du kannst es trotzdem. es gibt immer eine möglichkeit, und sei sie noch so dreckig. private besagt also eigentlich nichts anderes, als dass die funktion von aussen auf keinen fall aufgerufen werden soll. ob sie aufgerufen werden kann, ist eine andere sache. es geht nur darum, in der sprache (hier c#) syntaktisch den aufruf zu verhindern.


Anmelden zum Antworten