Wywoływanie metod

0

Czy jest dozwolone wywołanie zwykłej metody w sposób taki jaki wywołuję się metodę statyczną? (TAK/NIE ?)

1

Wyobraź sobie to tak:

class Whatever {
    static void foo(Whatever self) {
    }
}

Teraz spróbuj wywołać Whatever.foo() bez żadnego argumentu: mniej-więcej o coś takiego pytasz.

0

Cytat z książki:
...
Ten kod sprawia jednak jeden problem. Ponieważ pole name jest prywatne, metoda get spowoduje wyjątek IllegalAccessException. Za pomocą tej metody można sprawdzić tylko wartości
dostępnych pól. Zabezpieczenia w Javie zezwalają na sprawdzenie, jakie pola zawiera obiekt,
ale nie pozwalają na sprawdzenie ich wartości bez odpowiednich uprawnień dostępu.
Przy standardowych ustawieniach mechanizm refleksji honoruje mechanizmy ochronne Javy.
Jeśli jednak program nie działa pod kontrolą menedżera zabezpieczeń, można ominąć ustawienia ochrony dostępu.

W tym celu należy wywołać metodę setAccessible na rzecz obiektu klasy Field, Method lub Constructor.
Na przykład:
f.setAccessible(true);

Metoda setAccessible należy do klasy AccessibleObject, która jest wspólną nadklasą klas
Field, Method i Constructor. Została ona utworzona z myślą o debugerach, schowkach i podobnych mechanizmach. Nieco dalej używamy tej metody dla generycznej metody toString.

class ObjectAnalyzer
{
public String toString(Object obj)
{
Class cl = obj.getClass();
. . .
String r = cl.getName();
// Przegląd pól tej klasy i wszystkich jej nadklas.
do
{
r += "[";
Field[] fields = cl.getDeclaredFields();
AccessibleObject.setAccessible(fields, true);          //   tu zobaczcie, o to pytam
// Pobranie nazw i wartości wszystkich pól.
for (Field f : fields)
{
if (!Modifier.isStatic(f.getModifiers()))
{
if (!r.endsWith("[")) r += ","
r += f.getName() + "=";
try
{
Object val = f.get(obj);
r += toString(val);
}
catch (Exception e) { e.printStackTrace(); }
}
}
r += "]";
cl = cl.getSuperclass();
}
while (cl != null);
return r;
}
. . .
}
0

I co powiecie w tym przypadku?

0

Że nie rozumiesz, co wkleiłeś... Co ma setAccessible do tego? Przeczytaj wklejony przez siebie opis do tego kodu.
Object val = f.get(obj); - tu następuje wywołanie tej Twojej metody, i nie jest ona wywoływana na klasie, tylko na obiekcie, jak nie wierzysz, to daj null zamiast obj.

0

Widze ze kolega nie rozumie pytania przez swoje czytanie pochopne. czy ja pytam o cały kod? NIE! ja pytam tylko o metode setAccessible. Cała reszta z opisem jest dodatkiem abyście widzieli całość na jakims przykładzie.
Pytam o metodę setAccessible a nie o cały kod. Tu jest

 AccessibleObject.setAccessible(fields, true);

które pokazuje wzór na metoda statyczna a wyżej pisze że ta metoda zwykła jest wywoływana na obiekcie. W koncu zwykła czy statyczna???

1

Zerknij na dokumentacje:
https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/AccessibleObject.html

Zwykła metoda:

public void setAccessible(boolean flag)

I statyczna:

public static void setAccessible(AccessibleObject[] array, boolean flag)

Która robi to samo tylko dla tablicy obiektów.

0

Czy jest dozwolone wywołanie zwykłej metody w sposób taki jaki wywołuję się metodę statyczną? (TAK/NIE ?)
NIE

0

dzięki tmk13, szkoda że nie napisali tego w książce, robia jakieś przykłady na czyms innym a 10 cm wyżej pisali o tej metodzie cos innego. Myślałem że to jakiś błąd.
Dzieki i pozdro

1

Jakim cudem nie obrzuciłeś @tmk13 wyzwiskami? Przecież zawsze się domagasz krótkiej odpowiedzi na pytanie, TAK lub NIE, bez żadnych komentarzy, przykładów, kodu,...

0

Bo kolega wypowiedział sie krótko i na temat, bez wywodów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1