


Detaillierte Erläuterung des Reflexionsmechanismus der Java-Deserialisierung anhand von Beispielen
Dieser Artikel vermittelt Ihnen relevantes Wissen über Java und stellt hauptsächlich Probleme im Zusammenhang mit dem Reflexionsmechanismus von Java vor. Die Funktion des dynamischen Abrufens von Programminformationen und des dynamischen Aufrufs von Objekten wird hoffentlich als Reflexionsmechanismus bezeichnet nützlich für alle.
Java-Tutorial“
Jedes Mal, wenn ich einen großen Kerl reden oder Foren und andere Methoden zum Erlernen von Java-Deserialisierungsschwachstellen anschauen höre, wird es ein Wort namens Reflexionsmechanismus geben, und der große Kerl leiht sich etwas aus Mit diesem Wort werde ich eine Nutzlast für Sie erstellen. Für diejenigen von uns, die gerade Java-Deserialisierung gelernt haben, war ich vielleicht etwas verwirrt, also habe ich schnell eine Welle gelernt und die Großen werden immer größer. In diesem Artikel geht es also hauptsächlich um den Java-ReflexionsmechanismusJava-ReflexionsmechanismusDer Java-Reflexionsmechanismus bedeutet, dass Sie im laufenden Zustand des Programms ein Objekt jeder Klasse erstellen und die Klasse verstehen können, zu der jedes Objekt gehört. und Sie können die Mitgliedsvariablen und -methoden jeder Klasse verstehen und die Eigenschaften und Methoden jedes Objekts aufrufen. Diese Funktion zum dynamischen Abrufen von Programminformationen und zum dynamischen Aufrufen von Objekten wird als Reflexionsmechanismus der Java-Sprache bezeichnet. Reflexion gilt als Schlüssel zu dynamischen Sprachen. Ich bin nicht sehr gut in verbalen Ausdrücken, also mache ich es einfach im Bild obenein Beispiel dafür, dass der Reflexionsmechanismus nicht verwendet wird//定义一个animals接口interface animals { public abstract void print();}//定义类来实现animals接口的抽象方法class Dog implements animals { public void print() { System.out.println("Dog"); }}class Cat implements animals { public void print() { System.out.println("Cat"); }}// 构造一个zoo类// 之后如果我们在添加其他的实例的时候只需要修改zoo类class zoo { public static animals getInstance(String animalsName) { animals a = null; if ("Dog".equals(animalsName)) { a = new Dog(); } if ("Cat".equals(animalsName)) { a = new Cat(); } return a; }}public class reflection { public static void main(String[] args) { //借助zoo类寻找对应的类来实现接口 animals a=zoo.getInstance("Cat"); if(a!=null) a.print(); }}
- hinzufügen eine Klasse
- Zoo ändern
- Die Tierklasse der Hauptfunktion ändern
//定义一个animals接口interface animals { public abstract void print();}//定义类来实现animals接口的抽象方法class Dog implements animals { public void print() { System.out.println("Dog"); }}class Cat implements animals { public void print() { System.out.println("Cat"); }}// 构造一个zoo类// 之后如果我们在添加其他的实例的时候只需要修改zoo类class zoo { public static animals getInstance(String className) { animals a = null; try { //借助Class.forName寻找类名,并用newInstance实例化类似于new a = (animals) Class.forName(className).newInstance(); } catch (Exception e) { e.printStackTrace(); } return a; }}public class reflection { public static void main(String[] args) { //借助zoo类寻找对应的类来实现接口(classname为当前包名加类名) animals a = zoo.getInstance("com.cc1.Dog"); if (a != null) a.print(); }}
- Eine Klasse hinzufügen
- Ändern der Tierklasse von erforderlich die Hauptfunktion
- forName (Klasse aufrufen). )
- getMethod (Methode unter Klasse aufrufen)
- invoke (ausführen)
- newInstance (Objekt instanziieren)
Class.forName(className).getMethod(methodName).invoke(Class.forName(className).newInstance());
Class.forName (Erfassung des Klassennamens)
zoo.class (bereits geladene Klasse) obj.class (Instanz)
Klasseninitialisierung
- Ändern Sie die Zoo-Klasse und fügen Sie einen Anfangsblock hinzu. Statischer Anfangsblock und Konstruktor
Runtime.getRuntime().exec("notepad");
Nach dem Login kopieren- Ausführungsreihenfolge der Klasseninitialisierung
: Statischer Anfangsblock - > Anfangsblock - > Konstruktor
So ist bekannt Klasseninitialisierung und Klasseninstanziierung sind unterschiedlich. Fügen Sie als Nächstes die Klasse zoo1 hinzu, um die Zoo-Klasse zu erben
: Statischer Initialisierungsblock der übergeordneten Klasse – > Initialisierungsblock der übergeordneten Klasse – > Wenn Class.forName verwendet wird und der statische Initialisierungsblock der Klasse steuerbar ist, kann jeder Code ausgeführt werden.
Rufen Sie die interne Klasse auf. lang.Runtime ist der vollständige Pfad der Runtime-Klasse)
getMethod
getMethod wird verwendet, um eine bestimmte öffentliche Methode der Klasse durch Reflektion zu erhalten. Java unterstützt Klassenüberladung, aber eine Funktion kann nicht nur durch einen Funktionsnamen bestimmt werden. Wenn Sie also getMethod aufrufen, müssen Sie ihr die Parametertypliste der Methode übergeben
invoke
静态和动态方法的区别
invoke方法在getMethod类下,作用时传递参数,执行方法
public Object invoke(Object obj, Object… args)
第一个参数是getMethod获取的方法的类对象(如果方法是静态方法则传类)
获取exec函数的类对象
Class.forName(“java.lang.Runtime”).getMethod(“getRuntime”).invoke(Class.forName(“java.lang.Runtime”))
由于getRuntime是静态方法,所以传类
invoke(Class.forName(“java.lang.Runtime”).getMethod(“getRuntime”).invoke(Class.forName(“java.lang.Runtime”)),“calc.exe”)
最后我们合并一下
Class.forName("java.lang.Runtime"). getMethod("exec", String.class). invoke(Class.forName("java.lang.Runtime").getMethod("getRuntime").invoke(Class.forName("java.lang.Runtime")), "notepad");
指定构造方法生成实例
String str="notepad";ProcessBuilder pb = new ProcessBuilder(str);pb.start();
getConsturctor(函数可以选定指定接口格式的构造函数(由于构造函数也可以根据参数来进行重载)
选定后我们可以通过newInstance(),并传入构造函数的参数执行构造函数
ProcessBuilder类有两个构造函数
- public ProcessBuilder(String… command)(String…变长的字符串数组String[].class)
- public ProcessBuilder(List command)
分别使用构造方法
- Class.forName(“java.lang.ProcessBuilder”).getConstructor(String[].class).newInstance(new String[][]{{“notepad”}})
- Class.forName(“java.lang.ProcessBuilder”).getConstructor(List.class).newInstance(Arrays.asList(“notepad”))
执行完构造方法实例后,在进行强制转化使用start函数即可
( (ProcessBuilder) Class.forName(“java.lang.ProcessBuilder”).getConstructor(List.class).newInstance(Arrays.asList(“notepad”))).start();
实际中,肯定用不了,哪有这么好的事,还是接着反射把
Class.forName(“java.lang.ProcessBuilder”).getMethod(“start”).invoke(clazz.getConstructor(List.class).newInstance(Arrays.asList(“notepad”)));
这里可能有人会好奇我写的里那的另一个构造函数,String…command这个传参为什么用new String[][]{{“notepad”}},不应该是new String[]{“notepad”},现在用应该的
((ProcessBuilder) Class.forName(“java.lang.ProcessBuilder”).getConstructor(String[].class).newInstance(new String[]{“notepad”})).start();
在这行打断点调试
我们传的是一个字符串数组到了实例化的时候变成了一个字符串,再看看另一个构造函数(List)
( (ProcessBuilder) Class.forName(“java.lang.ProcessBuilder”).getConstructor(List.class).newInstance(Arrays.asList(“notepad”))).start();
依旧还是这行打断点
由此可知,List传入时会被当作Object的第一项,而String[]会被当做Object,所以多加一层[]{}
执行私有方法
通过函数getDeclaredConstructor获取私有方法,再利用setAccessible(true)打破私有方法限制
Class cls = Class.forName("java.lang.Runtime"); Constructor m = cls.getDeclaredConstructor(); m.setAccessible(true); cls.getMethod("exec", String.class).invoke(m.newInstance(), "notepad");
推荐学习:《java视频教程》
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Reflexionsmechanismus der Java-Deserialisierung anhand von Beispielen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.

Kapseln sind dreidimensionale geometrische Figuren, die aus einem Zylinder und einer Hemisphäre an beiden Enden bestehen. Das Volumen der Kapsel kann berechnet werden, indem das Volumen des Zylinders und das Volumen der Hemisphäre an beiden Enden hinzugefügt werden. In diesem Tutorial wird erörtert, wie das Volumen einer bestimmten Kapsel in Java mit verschiedenen Methoden berechnet wird. Kapselvolumenformel Die Formel für das Kapselvolumen lautet wie folgt: Kapselvolumen = zylindrisches Volumenvolumen Zwei Hemisphäre Volumen In, R: Der Radius der Hemisphäre. H: Die Höhe des Zylinders (ohne die Hemisphäre). Beispiel 1 eingeben Radius = 5 Einheiten Höhe = 10 Einheiten Ausgabe Volumen = 1570,8 Kubikeinheiten erklären Berechnen Sie das Volumen mithilfe der Formel: Volumen = π × R2 × H (4

Spring Boot vereinfacht die Schaffung robuster, skalierbarer und produktionsbereiteter Java-Anwendungen, wodurch die Java-Entwicklung revolutioniert wird. Der Ansatz "Übereinkommen über Konfiguration", der dem Feder -Ökosystem inhärent ist, minimiert das manuelle Setup, Allo
