Rumah Java javaTutorial Java中关于反射机制的实例详解

Java中关于反射机制的实例详解

Sep 08, 2017 am 11:04 AM
java Contoh mekanisme

这篇文章主要介绍了Java 反射机制实例详解的相关资料,这里对java中反射机制进行了详细的分析,需要的朋友可以参考下

Java 反射机制实例详解

一、JAVA是动态语言吗?

一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,Java和C++一样,都不是动态语言。

但JAVA它却有着一个非常突出的动态相关机制:反射。通过反射,Java可以于运行时加载、探知和使用编译期间完全求和的类、生成其对象实体,调用其方法或者对属性设值。所以Java算是一个半动态的语言吧。

反射的概念:

在Java中的反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;

对于任意一个对象,都能够调用它的任意一个方法;

这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制

二、动态性质

2.1、动态性质

运行时生成对象实例;
运行期间调用方法;
运行时更改属性

2.2、Java反射机制能实现的功能

在运行时判断任意一个对象所属的类
在运行时构造任意一个类的对象
在运行时判断任意怀个类所具有的方法和属性
在运行时调用任意一个对象的方法
生成动态代理

2.3、Java反射应用场合

在Java程序中许多对象在运行时都会出现两种类型:编译时类型和运行时类型

编译时的类型由声明该对象时使用的类型决定,运行时的类型由实际赋给对象的类型决定

如:


Person p =new Student();
Salin selepas log masuk

编译时类型为Person,而运行时为Student

除此之外,程序在运行时还可能接收到外部传入的一个对象,该对象的编译时类型为Object,但程序又需要调用该对象运行时类型的方法。为了这些问题程序需要在运行时发现对象和类的真实信息。然而,如果编译时根本无法预知该对象和类可能属于哪些类,程序只依靠运行时信息来发现该对象和类的真实信息,此时就必须使用反射

三、Java反射API

反射API用来生成在当前JAVA虚拟机中的类、接口或者对象的信息。

Class类:反射的核心类,可以获取类的属性,方法等内容信息。
Field类:Java.lang.reflect.表示类的属性,可以获取和设置类的中属性值。
Method类:Java.lang.reflect。表示类的方法,它可以用来获取类中方法的信息或者执行方法
Construcor类:Java.lang.reflect。表示类的构造方法。

四、获取全部方法和属性

Person类


package com.pb.Reflect.classinfo;

public class Person {
  private String name;
  private String gender;
  private int age;

  private Person() {
  //
  }
  public Person(String name, String gender, int age) {
    super();
    this.name = name;
    this.gender = gender;
    this.age = age;
  }
  //getter、和setter方法
  private String getName() {
    return name;
  }
  private void setName(String name) {
    this.name = name;
  }
  public String getGender() {
    return gender;
  }
  public void setGender(String gender) {
    this.gender = gender;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }

  public String toString(){
    return "姓名:"+name+"年龄: "+age;
  }

}
Salin selepas log masuk

使用反射:


package com.pb.Reflect.classinfo;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import javax.swing.JOptionPane;

/*
 * 通过用户输入类的全路径,来获取该类的成员方法和属性
 * Declared获取全部不管是私有和公有
 * 1.获取访问类的Class对象
 * 2.调用Class对象的方法返回访问类的方法和属性信息
 */
public class ReflectDemo {

  /*
   * 构造方法
   */
  public ReflectDemo(){
    //用户输入类的全路径径
    //使用String组件
    String classpsth=JOptionPane.showInputDialog(null,"输入类的全路径");
    //使用Class.forName方法根据输入的类的全路径 返回该类的Class对象
    try {
      Class cla = Class.forName(classpsth);
      //利用Class对象的cla的自审,返回方法对象集合
      Method [] method=cla.getDeclaredMethods(); //返回所有的方法
      System.out.println("========获取方法信息============");
      for (Method meth : method) {
        //遍历method数组,并输出方法信息
        System.out.println(meth.toString());
      }
      System.out.println("========获取出方法信息结束============");
      //获取属性利用Class对象的cla的自审,返回成员属性对象集合
       Field [] field=cla.getDeclaredFields();
        System.out.println("========获取成员属性信息============");
        for (Field f : field) {
          System.out.println(f.toString());
        }
        System.out.println("========获取成员属性信息结束============");
      //获取属性利用Class对象的cla的自审,返回构造方法集合
        Constructor [] constructor=cla.getDeclaredConstructors();
        System.out.println("========获取成员构造方法信息============");
        for (Constructor constru : constructor) {
          System.out.println(constru.toString());
        }
        System.out.println("========获取成员构造方法信息结束============");
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
      System.out.println("路径输入错误!");
    }
  }

}
Salin selepas log masuk


package com.pb.Reflect.classinfo;

public class TestReflection {

  public static void main(String[] args) {
    ReflectDemo rd=new ReflectDemo();

  }

}
Salin selepas log masuk

输入com.pb.Reflect.classinfo.Person

结果:


========获取方法信息============
public java.lang.String com.pb.Reflect.classinfo.Person.getGender()
public void com.pb.Reflect.classinfo.Person.setGender(java.lang.String)
public int com.pb.Reflect.classinfo.Person.getAge()
public void com.pb.Reflect.classinfo.Person.setAge(int)
public java.lang.String com.pb.Reflect.classinfo.Person.toString()
private java.lang.String com.pb.Reflect.classinfo.Person.getName()
private void com.pb.Reflect.classinfo.Person.setName(java.lang.String)
========获取出方法信息结束============
========获取成员属性信息============
private java.lang.String com.pb.Reflect.classinfo.Person.name
private java.lang.String com.pb.Reflect.classinfo.Person.gender
private int com.pb.Reflect.classinfo.Person.age
========获取成员属性信息结束============
========获取构造方法信息============
private com.pb.Reflect.classinfo.Person()
public com.pb.Reflect.classinfo.Person(java.lang.String,java.lang.String,int)
========获取构造方法信息结束============
Salin selepas log masuk

五、使用反射的步骤

5.1、步骤

Java.lang.reflect

获得想操作类的Java.lang.Class对象
调用Class的方法
使用反射API来操作这些信息

5.2、获取Class对象方式

调用某个对象的getClass()方法


Person p = new Person();
Class cla=p.getClass();
Salin selepas log masuk

调用某个类的class属性来获取该类对应的Class对象


Class cls=Person.class;
Salin selepas log masuk

使用Class类的forName()静态方法


Class cla=Class.forName(“类的全路径”);
Salin selepas log masuk

六、第二种方式对象的getClass()方法

Person类,因为要声明对象所以将构造方法public


package com.pb.Reflect.classinfo;

public class Person {
  private String name;
  private String gender;
  private int age;

  public Person() {
  //
  }
  public Person(String name, String gender, int age) {
    super();
    this.name = name;
    this.gender = gender;
    this.age = age;
  }
  //getter、和setter方法
  private String getName() {
    return name;
  }
  private void setName(String name) {
    this.name = name;
  }
  public String getGender() {
    return gender;
  }
  public void setGender(String gender) {
    this.gender = gender;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }

  public String toString(){
    return "姓名:"+name+"年龄: "+age;
  }

}
Salin selepas log masuk

使用反射:


package com.pb.Reflect.classinfo;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import javax.swing.JOptionPane;

/*
 * 通过用户输入类的全路径,来获取该类的成员方法和属性
 * Declared获取全部不管是私有和公有
 * 1.获取访问类的Class对象
 * 2.调用Class对象的方法返回访问类的方法和属性信息
 */

  public ReflectDemo(Person p){
    Class cla=p.getClass();
    //利用Class对象的cla的自审,返回方法对象集合
    Method [] method=cla.getDeclaredMethods(); //返回所有的方法
    System.out.println("========获取方法信息============");
    for (Method meth : method) {
      //遍历method数组,并输出方法信息
      System.out.println(meth.toString());
    }
    System.out.println("========获取出方法信息结束============");
    //获取属性利用Class对象的cla的自审,返回成员属性对象集合
     Field [] field=cla.getDeclaredFields();
      System.out.println("========获取成员属性信息============");
      for (Field f : field) {
        System.out.println(f.toString());
      }
      System.out.println("========获取成员属性信息结束============");
    //获取属性利用Class对象的cla的自审,返回构造方法集合
      Constructor [] constructor=cla.getDeclaredConstructors();
      System.out.println("========获取成员构造方法信息============");
      for (Constructor constru : constructor) {
        System.out.println(constru.toString());
      }
      System.out.println("========获取成员构造方法信息结束============");
  }

}
Salin selepas log masuk

测试类


package com.pb.Reflect.classinfo;

public class TestReflection {

  public static void main(String[] args) {
    Person p=new Person();
    ReflectDemo rd=new ReflectDemo(p);

  }

}
Salin selepas log masuk


========获取方法信息============
public java.lang.String com.pb.Reflect.classinfo.Person.getGender()
public void com.pb.Reflect.classinfo.Person.setGender(java.lang.String)
public int com.pb.Reflect.classinfo.Person.getAge()
public void com.pb.Reflect.classinfo.Person.setAge(int)
public java.lang.String com.pb.Reflect.classinfo.Person.toString()
private java.lang.String com.pb.Reflect.classinfo.Person.getName()
private void com.pb.Reflect.classinfo.Person.setName(java.lang.String)
========获取出方法信息结束============
========获取成员属性信息============
private java.lang.String com.pb.Reflect.classinfo.Person.name
private java.lang.String com.pb.Reflect.classinfo.Person.gender
private int com.pb.Reflect.classinfo.Person.age
========获取成员属性信息结束============
========获取成员构造方法信息============
public com.pb.Reflect.classinfo.Person()
public com.pb.Reflect.classinfo.Person(java.lang.String,java.lang.String,int)
========获取成员构造方法信息结束============
Salin selepas log masuk
Salin selepas log masuk

七、第三种方法类的.class属性

Person类同上

测试类:


package com.pb.Reflect.classinfo;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class TestReflection {

  public static void main(String[] args) {
    /*第二种方法
    Person p=new Person();
    ReflectDemo rd=new ReflectDemo(p);
*/

    /*
     * 第三种方式.class属性
     */
    Class cla=Person.class;
    //利用Class对象的cla的自审,返回方法对象集合
        Method [] method=cla.getDeclaredMethods(); //返回所有的方法
        System.out.println("========获取方法信息============");
        for (Method meth : method) {
          //遍历method数组,并输出方法信息
          System.out.println(meth.toString());
        }
        System.out.println("========获取出方法信息结束============");
        //获取属性利用Class对象的cla的自审,返回成员属性对象集合
         Field [] field=cla.getDeclaredFields();
          System.out.println("========获取成员属性信息============");
          for (Field f : field) {
            System.out.println(f.toString());
          }
          System.out.println("========获取成员属性信息结束============");
        //获取属性利用Class对象的cla的自审,返回构造方法集合
          Constructor [] constructor=cla.getDeclaredConstructors();
          System.out.println("========获取成员构造方法信息============");
          for (Constructor constru : constructor) {
            System.out.println(constru.toString());
          }
          System.out.println("========获取成员构造方法信息结束============");
  }

}
Salin selepas log masuk

结果:

同上


========获取方法信息============
public java.lang.String com.pb.Reflect.classinfo.Person.getGender()
public void com.pb.Reflect.classinfo.Person.setGender(java.lang.String)
public int com.pb.Reflect.classinfo.Person.getAge()
public void com.pb.Reflect.classinfo.Person.setAge(int)
public java.lang.String com.pb.Reflect.classinfo.Person.toString()
private java.lang.String com.pb.Reflect.classinfo.Person.getName()
private void com.pb.Reflect.classinfo.Person.setName(java.lang.String)
========获取出方法信息结束============
========获取成员属性信息============
private java.lang.String com.pb.Reflect.classinfo.Person.name
private java.lang.String com.pb.Reflect.classinfo.Person.gender
private int com.pb.Reflect.classinfo.Person.age
========获取成员属性信息结束============
========获取成员构造方法信息============
public com.pb.Reflect.classinfo.Person()
public com.pb.Reflect.classinfo.Person(java.lang.String,java.lang.String,int)
========获取成员构造方法信息结束============
Salin selepas log masuk
Salin selepas log masuk

Atas ialah kandungan terperinci Java中关于反射机制的实例详解. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Nombor Sempurna di Jawa Nombor Sempurna di Jawa Aug 30, 2024 pm 04:28 PM

Panduan Nombor Sempurna di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor Perfect dalam Java?, contoh dengan pelaksanaan kod.

Weka di Jawa Weka di Jawa Aug 30, 2024 pm 04:28 PM

Panduan untuk Weka di Jawa. Di sini kita membincangkan Pengenalan, cara menggunakan weka java, jenis platform, dan kelebihan dengan contoh.

Nombor Smith di Jawa Nombor Smith di Jawa Aug 30, 2024 pm 04:28 PM

Panduan untuk Nombor Smith di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor smith di Jawa? contoh dengan pelaksanaan kod.

Soalan Temuduga Java Spring Soalan Temuduga Java Spring Aug 30, 2024 pm 04:29 PM

Dalam artikel ini, kami telah menyimpan Soalan Temuduga Spring Java yang paling banyak ditanya dengan jawapan terperinci mereka. Supaya anda boleh memecahkan temuduga.

Cuti atau kembali dari Java 8 Stream Foreach? Cuti atau kembali dari Java 8 Stream Foreach? Feb 07, 2025 pm 12:09 PM

Java 8 memperkenalkan API Stream, menyediakan cara yang kuat dan ekspresif untuk memproses koleksi data. Walau bagaimanapun, soalan biasa apabila menggunakan aliran adalah: bagaimana untuk memecahkan atau kembali dari operasi foreach? Gelung tradisional membolehkan gangguan awal atau pulangan, tetapi kaedah Foreach Stream tidak menyokong secara langsung kaedah ini. Artikel ini akan menerangkan sebab -sebab dan meneroka kaedah alternatif untuk melaksanakan penamatan pramatang dalam sistem pemprosesan aliran. Bacaan Lanjut: Penambahbaikan API Java Stream Memahami aliran aliran Kaedah Foreach adalah operasi terminal yang melakukan satu operasi pada setiap elemen dalam aliran. Niat reka bentuknya adalah

TimeStamp to Date in Java TimeStamp to Date in Java Aug 30, 2024 pm 04:28 PM

Panduan untuk TimeStamp to Date di Java. Di sini kita juga membincangkan pengenalan dan cara menukar cap waktu kepada tarikh dalam java bersama-sama dengan contoh.

Program Java untuk mencari kelantangan kapsul Program Java untuk mencari kelantangan kapsul Feb 07, 2025 am 11:37 AM

Kapsul adalah angka geometri tiga dimensi, terdiri daripada silinder dan hemisfera di kedua-dua hujungnya. Jumlah kapsul boleh dikira dengan menambahkan isipadu silinder dan jumlah hemisfera di kedua -dua hujungnya. Tutorial ini akan membincangkan cara mengira jumlah kapsul yang diberikan dalam Java menggunakan kaedah yang berbeza. Formula volum kapsul Formula untuk jumlah kapsul adalah seperti berikut: Kelantangan kapsul = isipadu isipadu silinder Dua jumlah hemisfera dalam, R: Radius hemisfera. H: Ketinggian silinder (tidak termasuk hemisfera). Contoh 1 masukkan Jejari = 5 unit Ketinggian = 10 unit Output Jilid = 1570.8 Unit padu menjelaskan Kirakan kelantangan menggunakan formula: Kelantangan = π × r2 × h (4

PHP vs Python: Memahami Perbezaan PHP vs Python: Memahami Perbezaan Apr 11, 2025 am 12:15 AM

PHP dan Python masing -masing mempunyai kelebihan sendiri, dan pilihannya harus berdasarkan keperluan projek. 1.Php sesuai untuk pembangunan web, dengan sintaks mudah dan kecekapan pelaksanaan yang tinggi. 2. Python sesuai untuk sains data dan pembelajaran mesin, dengan sintaks ringkas dan perpustakaan yang kaya.

See all articles