Heim > Java > JavaBase > Hauptteil

Was ist Reflexion in Java?

angryTom
Freigeben: 2019-11-11 10:04:08
Original
5530 Leute haben es durchsucht

Was ist Reflexion in Java?

Was ist Reflexion?

Bezieht sich hauptsächlich auf die Fähigkeit eines Programms, auf seinen eigenen Status oder sein eigenes Verhalten zuzugreifen, ihn zu erkennen und zu ändern.

Was ist Java-Reflektion?

Java-Reflexion bedeutet, dass im laufenden Zustand des Java-Programms für jede Klasse alle Eigenschaften und Methoden dieser Klasse abgerufen werden können kann als eine beliebige seiner Eigenschaften und Methoden bezeichnet werden. Diese Methode zum dynamischen Abrufen des Inhalts einer Klasse und zum dynamischen Aufrufen von Objekten wird als Reflexionsmechanismus bezeichnet.

Der Java-Reflektionsmechanismus bietet hauptsächlich die folgenden Funktionen:

* 1. Bestimmen Sie die Klasse, zu der ein Objekt zur Laufzeit gehört.

* 2. Konstruieren Sie zur Laufzeit ein Objekt einer beliebigen Klasse.

* 3. Bestimmen Sie die Mitgliedsvariablen und Methoden einer beliebigen Klasse zur Laufzeit.

* 4. Rufen Sie die Methode eines beliebigen Objekts zur Laufzeit auf.

Der Reflexionsmechanismus von Java wird hauptsächlich zur Analyse der Klassenfähigkeiten verwendet. Wir können zur Laufzeit Informationen über Mitglieder und Mitglieder jedes Typs in einem Programm oder einer Assembly erhalten. Die allgemeinen Objekttypen im Programm werden während der Kompilierung bestätigt. Der Reflexionsmechanismus von Java kann Objekte dynamisch erstellen und ihre Eigenschaften zur Laufzeit aufrufen. Daher besteht der Kern der Reflexion darin, Klassen dynamisch zu laden oder Methoden aufzurufen, um zur Laufzeit auf Eigenschaften zuzugreifen. Es ist nicht erforderlich, im Voraus zu wissen, wer das laufende Objekt ist.

Reflection kann verwendet werden, um:

Zur Laufzeit ein Objekt einer beliebigen Klasse zu konstruieren/zu bestimmen Rufen Sie die Eigenschaften und Methoden einer beliebigen Klasse ab, einschließlich geerbter öffentlicher Methoden, die zur Laufzeit Methoden eines beliebigen Objekts aufrufen.

Beispiel:

a) Get-Methode

Die Routine-DumpMethods-Klasse demonstriert die grundlegende Rolle der Reflection-API, die die angegebenen Befehlszeilenparameter liest Klassennamen und gibt dann die Methodeninformationen dieser Klasse aus. ​

import java.lang.reflect.Method;
 
public class DumpMethods
{
    public static void main(String[] args) throws Exception //在方法后加上这句,异常就消失了
    {
        //获得字符串所标识的类的class对象
        Class<?> classType = Class.forName("java.lang.String");//在此处传入字符串指定类名,所以参数获取可以是一个运行期的行为,可以用args[0]
 
        //返回class对象所对应的类或接口中,所声明的所有方法的数组(包括私有方法)
        Method[] methods = classType.getDeclaredMethods();
 
        //遍历输出所有方法声明
        for(Method method : methods)
        {
            System.out.println(method);
        }
    }
 
}
Nach dem Login kopieren

b) Methode durch Reflexion aufrufen

import java.lang.reflect.Method;
 
public class InvokeTester
{
    public int add(int param1, int param2)
    {
        return param1 + param2;
 
    }
 
    public String echo(String message)
    {
        return "Hello: " + message;
    }
 
    public static void main(String[] args) throws Exception
    {
 
        // 以前的常规执行手段
        InvokeTester tester = new InvokeTester();
        System.out.println(tester.add(1, 2));
        System.out.println(tester.echo("Tom"));
        System.out.println("---------------------------");
 
        // 通过反射的方式
 
        // 第一步,获取Class对象
        // 前面用的方法是:Class.forName()方法获取
        // 这里用第二种方法,类名.class
        Class<?> classType = InvokeTester.class;
 
        // 生成新的对象:用newInstance()方法
        Object invokeTester = classType.newInstance();
        System.out.println(invokeTester instanceof InvokeTester); // 输出true
 
        // 通过反射调用方法
        // 首先需要获得与该方法对应的Method对象
        Method addMethod = classType.getMethod("add", new Class[] { int.class,
                int.class });
        // 第一个参数是方法名,第二个参数是这个方法所需要的参数的Class对象的数组
 
        // 调用目标方法
        Object result = addMethod.invoke(invokeTester, new Object[] { 1, 2 });
        System.out.println(result); // 此时result是Integer类型
 
        //调用第二个方法
        Method echoMethod = classType.getDeclaredMethod("echo", new Class[]{String.class});
        Object result2 = echoMethod.invoke(invokeTester, new Object[]{"Tom"});
        System.out.println(result2);
 
    }
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWas ist Reflexion in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!