Rumah Java javaTutorial Java中关于反射机制需要注意的事情

Java中关于反射机制需要注意的事情

Sep 21, 2017 am 09:51 AM
java mekanisme perlukan

这篇文章主要介绍了Java反射机制的相关内容,涉及了class类的动态加载,获取成员变量、构造函数信息等信息,需要的朋友可以参考下。

大家都知道,要让Java程序能够运行,那么就得让Java类要被Java虚拟机加载。Java类如果不被Java虚拟机加载,是不能正常运行的。现在我们运行的所有的程序都是在编译期的时候就已经知道了你所需要的那个类的已经被加载了。

Java的反射机制是在编译并不确定是哪个类被加载了,而是在程序运行的时候才加载、探知、自审。使用在编译期并不知道的类。这样的特点就是反射。

反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

本篇将从以下几个方面讲述反射的知识:

calss的使用 方法的反射 构造函数的反射 成员变量的反射

一、什么是class类

在面向对象的世界里,万物皆对象。类是对象,类是java.lang.Class类的实例对象。另外class类只有java虚拟机才能new出来。任何一个类都是Class 类的实例对象。这实例对象有三种表达方式:


public class User{
} 
public class ClassTest{
User u=new User();
 //方式1:
 Class c1=User.class;
//方式2:
Class c2=u.getClass();
//方式3:
Class c3=Class.forName("com.forezp.User");
 
//可以通过类的类型创建该类的实例对象
User user=(User)c1.newInstance();
}
Salin selepas log masuk

二、class类的动态加载

Class.forName(类的全称);该方法不仅表示了类的类型,还代表了动态加载类。编译时刻加载类是静态加载、运行时刻加载类是动态加载类。

三、获取方法信息

基本的数据类型,void关键字都Class 类的实例;可以通过get
ame();getSimpleName()获取类的名称。


Class c1=String.class;
Class c2=int.class;
Class c3=void.class;
System.out.println(c1.getName());
System.out.println(c2.getSimpleName());
Salin selepas log masuk

获取类的所有方法,并打印出来:


public static void printClassInfo(Object object){
  Class c=object.getClass();
  System.out.println("类的名称:"+c.getName());
  /**
   * 一个成员方法就是一个method对象
   * getMethod()所有的 public方法,包括父类继承的 public
   * getDeclaredMethods()获取该类所有的方法,包括private ,但不包括继承的方法。
   */
  Method[] methods=c.getMethods();//获取方法
  //获取所以的方法,包括private ,c.getDeclaredMethods();
  for(int i=0;i<methods.length;i++){ parametertypes="methods[i].getParameterTypes();" pre="" returntype="methods[i].getReturnType();"></methods.length;i++){>
Salin selepas log masuk


public class ReflectTest {
  public static void main(String[] args){
    String s="ss";
    ClassUtil.printClassInfo(s);
  }
}
Salin selepas log masuk

运行:


类的名称:java.lang.String
booleanequals(java.lang.Object,)
java.lang.StringtoString()
inthashCode()
…
Salin selepas log masuk

四、获取成员变量的信息

也可以获取类的成员变量信息


public static void printFiledInfo(Object o){
  Class c=o.getClass();
  /**
  * getFileds()获取public
  * getDeclaredFields()获取所有
  */
  Field[] fileds=c.getDeclaredFields();
  for(Field f:fileds){
   //获取成员变量的类型
   Class filedType=f.getType();
   System.out.println(filedType.getName()+" "+f.getName());
  }
 }
Salin selepas log masuk


public static void main(String[] args){
    String s="ss";
    //ClassUtil.printClassInfo(s);
    ClassUtil.printFiledInfo(s);
  }
Salin selepas log masuk

运行:


[C value 
int hash 
long serialVersionUID 
[Ljava.io.ObjectStreamField; serialPersistentFields 
java.util.Comparator CASE_INSENSITIVE_ORDER 
int HASHING_SEED 
int hash32
Salin selepas log masuk

五、获取构造函数的信息


public static void printConstructInfo(Object o){
  Class c=o.getClass();
  Constructor[] constructors=c.getDeclaredConstructors();
  for (Constructor con:constructors){
   System.out.print(con.getName()+"(");
   Class[] typeParas=con.getParameterTypes();
   for (Class class1:typeParas){
    System.out.print(class1.getName()+" ,");
   }
   System.out.println(")");
  }
 }
Salin selepas log masuk


public static void main(String[] args){
    String s="ss";
    //ClassUtil.printClassInfo(s);
    //ClassUtil.printFiledInfo(s);
    ClassUtil.printConstructInfo(s);
  }
Salin selepas log masuk

运行:


java.lang.String([B ,) 
java.lang.String([B ,int ,int ,) 
java.lang.String([B ,java.nio.charset.Charset ,) 
java.lang.String([B ,java.lang.String ,) 
java.lang.String([B ,int ,int ,java.nio.charset.Charset ,) 
java.lang.String(int ,int ,[C ,) 
java.lang.String([C ,boolean ,) 
java.lang.String(java.lang.StringBuilder ,) 
java.lang.String(java.lang.StringBuffer ,)
…
Salin selepas log masuk

六、方法反射的操作

获取一个方法:需要获取方法的名称和方法的参数才能决定一个方法。

方法的反射操作:


method.invoke(对象,参数列表);
Salin selepas log masuk

举个例子:


class A{
 public void add(int a,int b){
  System.out.print(a+b);
 }
 public void toUpper(String a){
  System.out.print(a.toUpperCase());
 }
}
Salin selepas log masuk


public static void main(String[] args) {
  A a=new A();
  Class c=a.getClass();
  try {
   Method method=c.getMethod("add",new Class[]{int.class,int.class});
   //也可以 Method method=c.getMethod("add",int.class,int.class);
   //方法的反射操作
   method.invoke(a,10,10);
  }catch (Exception e){
   e.printStackTrace();
  }
 }
Salin selepas log masuk

运行:


20
Salin selepas log masuk

本篇文章已经讲解了java反射的基本用法, 它可以在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

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

Cipta Masa Depan: Pengaturcaraan Java untuk Pemula Mutlak Cipta Masa Depan: Pengaturcaraan Java untuk Pemula Mutlak Oct 13, 2024 pm 01:32 PM

Java ialah bahasa pengaturcaraan popular yang boleh dipelajari oleh pembangun pemula dan berpengalaman. Tutorial ini bermula dengan konsep asas dan diteruskan melalui topik lanjutan. Selepas memasang Kit Pembangunan Java, anda boleh berlatih pengaturcaraan dengan mencipta program "Hello, World!" Selepas anda memahami kod, gunakan gesaan arahan untuk menyusun dan menjalankan program, dan "Hello, World!" Pembelajaran Java memulakan perjalanan pengaturcaraan anda, dan apabila penguasaan anda semakin mendalam, anda boleh mencipta aplikasi yang lebih kompleks.

See all articles