Rumah Java Javabermula 对于java反射机制的详细介绍

对于java反射机制的详细介绍

Nov 25, 2019 pm 02:48 PM
java mekanisme refleksi

对于java反射机制的详细介绍

本文由java编程入门栏目为大家详细介绍java中的反射机制,希望可以帮助到对于此机制有所不懂的同学。

java反射

机制是运行状态中,对于任意一个类都能够知道这个类的所有属性和方法(包括私有的);对于任意一个对象,都能调用他的任意方法和属性;这种动态获取信息及动态调用对象方法的功能称为Java的反射机制。

用途:

在运行时判断任意一个对象所属的类。

在运行时构造任意一个类的对象。

在运行时判断任意一个类所具有的成员变量和方法。

在运行时调用任意一个对象的方法。

生成动态代理。

反射相关的类

99244da45e54e41795a004a3da886f4.png

class类

在Java程序中获得Class对象通常有如下三种方式:

1.使用Class类的forName(String clazzName)静态方法。该方法需要传入字符串参数,该字符串参数的值是某个类的全限定名(必须添加完整包名)。

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

3.调用某个对象的getClass()方法。该方法是java.lang.Object类中的一个方法。

Field

Field[] allFields = class2.getDeclaredFields();//获取class对象的所有属性
Field[] publicFields = class2.getFields();//获取class对象的public属性
Field ageField = class2.getDeclaredField("age");//获取class指定属性,可以获得私有属性
Field desField = class2.getField("des");//获取class指定的public属性
Salin selepas log masuk

Method

Method[] methods = class2.getDeclaredMethods();//获取class对象的所有声明方法
Method[] allMethods = class2.getMethods();//获取class对象的所有public方法 包括父类的方法
Method method = class2.getMethod("info", String.class);//返回次Class对象对应类的、带指定形参列表的public方法
Method declaredMethod = class2.getDeclaredMethod("info", String.class);//返回次Class对象对应类的、
带指定形参列表的方法
Salin selepas log masuk

Constructor

Constructor<?>[] allConstructors = class2.getDeclaredConstructors();//获取class对象的所有声明构造函数
Constructor<?>[] publicConstructors = class2.getConstructors();//获取class对象public构造函数
Constructor<?> constructor = class2.getDeclaredConstructor(String.class);//获取指定声明构造函数
Constructor publicConstructor = class2.getConstructor(String.class);//获取指定声明的public构造函数
Salin selepas log masuk

通过反射 生成实例对象

1.使用Class对象的newInstance()方法来创建该Class对象对应类的实例。这种方式要求该Class对象的对应类有默认构造器,而执行newInstance()方法时实际上是利用默认构造器来创建该类的实例。

2.先使用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建该Class对象对应类的实例。通过这种方式可以选择使用指定的构造器来创建实例。

调用方法

1.通过Class对象的getMethods()方法或者getMethod()方法获得指定方法,返回Method数组或对象。

2.调用Method对象中的Object invoke(Object obj, Object… args)方法。第一个参数对应调用该方法的实例对象,第二个参数对应该方法的参数。

实例代码:

反射是什么?

package am;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
import javax.activation.FileDataSource;
/**
 * 反射是什么:
 *    java中的反射:就是在类的加载过程中,发现类的属性和方法构造方法等信息。可以获得类的属性值,可以调用类的方法。
 *    
 * 
 * 反射获得类的对象。
 *
 */
public class Demo01 {
	public static void main(String[] args) throws Exception{
		// 通过反射,获取类的对象。
		Object obj = create("am.Foo");;
		Foo foo = (Foo)obj;
		System.out.println(foo.a);
		double dou = foo.show(12, "hello");
		System.out.println(dou);
		System.out.println("======================================");
		// 获得类的属性
		showField(obj);
		System.out.println("======================================");
		double a = (double)getFieldValue(obj, "b");
		System.out.println(a);
		System.out.println("========================================");
		// 通过反射调用方法。
		Object ob = getMethodValue(obj,"show",new Class[]{int.class,String.class},new Object[]{23,"abc"});
		double douValue = (double)ob;
		System.out.println(douValue);
	}
//通过反射调用方法,哪个对象,什么名称,参数类型,参数值
	public static Object getMethodValue(Object obj,String method,Class[] paramType,Object[] param)
	throws Exception{
		Class cla = obj.getClass();
		Method me = cla.getDeclaredMethod(method, paramType);
		Object o = me.invoke(obj, param);
		return o;
	}
	// 获取类的属性值:
	public static Object getFieldValue(Object obj,String name)throws Exception{
		Class cla = obj.getClass();// 获取字节码对象。
		Field field = cla.getDeclaredField(name);// 通过属性的名称。获取当前属性。
		Object result = field.get(obj);
		return result;
	}
	// 通过反射,可以获得类的属性信息以及方法信息。
	public static void showField(Object obj){
		// java中对属性类。 Field   方法类:Method
		Class cla = obj.getClass();
		System.out.println("获取类名:"+cla.getName());
		System.out.println("======================================");
		// 获取类的属性:
		Field[] fields = cla.getDeclaredFields();// 获取公开的属性。
		for(Field field : fields){
			System.out.println("获取类的属性类型"+field.getType());
			System.out.println("获取类的属性名称:"+field.getName());
		}
		System.out.println("======================================");
		// 获取类的方法。
		Method[] methods = cla.getDeclaredMethods();
		for(Method method : methods){
			System.out.println("获取方法的返回值类型:"+method.getReturnType());
			System.out.println("获取方法名称:"+method.getName());
			System.out.println("获取方法的参数类型。"+Arrays.toString(method.getParameterTypes()));
		}
		System.out.println("=======================================");
		// 获取类的构造方法:
		Constructor[] cons = cla.getDeclaredConstructors();
		for(Constructor con : cons){
			System.out.println("构造方法的名字:"+con.getName());
			System.out.println("构造方法参数类型:"+Arrays.toString(con.getParameterTypes()));
		}	
	}
	// 如何反射类的实例。
	public static Object create(String name) throws Exception{
		// 反射的方法。Class.forName();
		Class cla = Class.forName(name);
		// 如何获得Object类型对象。
		Object obj = cla.newInstance();
		return obj;
	}
}
// 模拟类。
class Foo{
	int a = 10;
	double b = 20;
	public double show(int p,String str){
		System.out.println("调用方法传入的值是:"+str);
		return a+b+p;
	}
	public Foo(){
	}
	public Foo(int a,int b){
	}
}
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

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

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

Bagaimana untuk menjalankan aplikasi boot musim bunga pertama anda di Spring Tool Suite? Bagaimana untuk menjalankan aplikasi boot musim bunga pertama anda di Spring Tool Suite? Feb 07, 2025 pm 12:11 PM

Spring Boot memudahkan penciptaan aplikasi Java yang mantap, berskala, dan siap pengeluaran, merevolusi pembangunan Java. Pendekatan "Konvensyen Lebih Konfigurasi", yang wujud pada ekosistem musim bunga, meminimumkan persediaan manual, Allo

See all articles