java之反射基础
1、反射是什么
反射机制是在运行状态中,对任意的一个类,都可以知道这个类的所有方法和属性; 对于任何一个对象,都可以调用他的任意方法和属性,这种<动态获取/font>的信息以及动态调用对象的方法称为java的反射机制。
2、反射的作用
1、反编译: .class–>java
2、通过反射机制访问对象的属性,方法,构造方法等
3、反射的具体实现
3、1反射相关的类
java.lang.Class;
java.lang.reflect.Constructor;
java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;
3.2 获取大Class对象的三种方式
由于任何类都是Object的子类而Object中有getClass可以获取Class
对象
- public final native Class<?> getClass();
-
package com.chb.reflectTest;public class Test { public static void main(String[] args) throws Exception { //第一种方式: Class<?> c1 = Class.forName("com.chb.reflectTest.Test"); //第二种方式:java中每个类都有class属性 Class<?> c2 = Test.class; //第三种方式:每个对象都与getClass()方法 Class<?> c3 = new Test().getClass(); } }
3.3创建对象
获取Class对象以后,使用它创建对象,通过newInstance()调用无参构造函数进行创建对象,newInstance()返回一个Object对象:
Class<?> c1 = Class.forName("com.chb.reflectTest.Test");Object o1 = c1.newInstance();
3.4、获取数据
分为所有属性和制定的属性
3.4.1、获取所有属性
获取修饰
首先通过属性的getModifiers()获取修饰对象,
再通过java.long.reflect.Modifier的toString()打印类,属性的修饰(public , static ,final等)。
获取属性
获取所有属性:通过Class对象的getDeclaedFields(),返回一个Filed的数组**。
获取属性的类型:
通过属性对象(Field对象)的getType()
Class<?> cString = Class.forName("java.lang.String"); //获取累的修饰和名称 System.out.print(Modifier.toString(cString.getModifiers())+" class " + cString.getSimpleName()+"{\n"); //获取所有属性 Field[] fields = cString.getDeclaredFields(); for (Field field : fields) { System.out.print("\t"); System.out.print( Modifier.toString(field.getModifiers())+" "//属性的修饰 + field.getType().getSimpleName()+" " + field.getName()+"\n"); } System.out.println("}");
3.4.2 获取指定属性
创建测试对象:
注意: 我在Use类中定义了两个属性, 一个public ,一个private ,是为了下一个测试反射可以打破封装性
package com.chb.reflectTest;public class User { private String name; public String nickName; public User() {} public User(String name, String nickName) { this.name = name; this.nickName = nickName; } setter getter... }
传统属性的获取和通过反射获取对比:
package com.chb.reflectTest;import java.lang.reflect.Field;public class Test1 { public static void main(String[] args) throws Exception { //传统获取属性的值 //1、通过getter,setter User user1 = new User(); user1.setName("lisi"); System.out.println(user1.getName()); //2、直接调用属性 User user2 = new User(); user2.nickName = "癞皮狗"; System.out.println(user2.nickName); //========================================= //通过反射来设置,获取属性。 Class<User> c1 = (Class<User>) Class.forName("com.chb.reflectTest.User"); User user = c1.newInstance(); Field nickField = c1.getDeclaredField("nickName"); nickField.set(user, "123"); System.out.println(nickField.get(user)); Field nameFiled = c1.getDeclaredField("name"); //Exception in thread "main" java.lang.IllegalAccessException: Class com.chb.reflectTest.Test1 can not access a member of class com.chb.reflectTest.User with modifiers "private" nameFiled.setAccessible(true); nameFiled.set(user, "oup"); System.out.println(nameFiled.get(user)); } }
通过反射来设置属性的值, 区别属性的修饰范围, 私有的不可以直接设置
会出现访问错误, 也就是java的安全访问机制,报错:
Exception in thread "main" java.lang.IllegalAccessException: Class com.chb.reflectTest.Test1 can not access a member of class com.chb.reflectTest. User with modifiers "private"
我们通过一个方法·来打破java的封装性:
nameFiled.setAccessible(true);
1、反射是什么
反射机制是在运行状态中,对任意的一个类,都可以知道这个类的所有方法和属性; 对于任何一个对象,都可以调用他的任意方法和属性,这种<动态获取/font>的信息以及动态调用对象的方法称为java的反射机制。
2、反射的作用
1、反编译: .class–>java
2、通过反射机制访问对象的属性,方法,构造方法等
3、反射的具体实现
3、1反射相关的类
java.lang.Class;
java.lang.reflect.Constructor;
java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;
3.2 获取大Class对象的三种方式
由于任何类都是Object的子类而Object中有getClass可以获取Class
对象
- public final native Class<?> getClass();
-
package com.chb.reflectTest;public class Test { public static void main(String[] args) throws Exception { //第一种方式: Class<?> c1 = Class.forName("com.chb.reflectTest.Test"); //第二种方式:java中每个类都有class属性 Class<?> c2 = Test.class; //第三种方式:每个对象都与getClass()方法 Class<?> c3 = new Test().getClass(); } }
3.3创建对象
获取Class对象以后,使用它创建对象,通过newInstance()调用无参构造函数进行创建对象,newInstance()返回一个Object对象:
Class<?> c1 = Class.forName("com.chb.reflectTest.Test");Object o1 = c1.newInstance();
3.4、获取数据
分为所有属性和制定的属性
3.4.1、获取所有属性
获取修饰
首先通过属性的getModifiers()获取修饰对象,
再通过java.long.reflect.Modifier的toString()打印类,属性的修饰(public , static ,final等)。
获取属性
获取所有属性:通过Class对象的getDeclaedFields(),返回一个Filed的数组**。
获取属性的类型:
通过属性对象(Field对象)的getType()
Class<?> cString = Class.forName("java.lang.String"); //获取累的修饰和名称 System.out.print(Modifier.toString(cString.getModifiers())+" class " + cString.getSimpleName()+"{\n"); //获取所有属性 Field[] fields = cString.getDeclaredFields(); for (Field field : fields) { System.out.print("\t"); System.out.print( Modifier.toString(field.getModifiers())+" "//属性的修饰 + field.getType().getSimpleName()+" " + field.getName()+"\n"); } System.out.println("}");
3.4.2 获取指定属性
创建测试对象:
注意: 我在Use类中定义了两个属性, 一个public ,一个private ,是为了下一个测试反射可以打破封装性
package com.chb.reflectTest;public class User { private String name; public String nickName; public User() {} public User(String name, String nickName) { this.name = name; this.nickName = nickName; } setter getter... }
传统属性的获取和通过反射获取对比:
package com.chb.reflectTest;import java.lang.reflect.Field;public class Test1 { public static void main(String[] args) throws Exception { //传统获取属性的值 //1、通过getter,setter User user1 = new User(); user1.setName("lisi"); System.out.println(user1.getName()); //2、直接调用属性 User user2 = new User(); user2.nickName = "癞皮狗"; System.out.println(user2.nickName); //========================================= //通过反射来设置,获取属性。 Class<User> c1 = (Class<User>) Class.forName("com.chb.reflectTest.User"); User user = c1.newInstance(); Field nickField = c1.getDeclaredField("nickName"); nickField.set(user, "123"); System.out.println(nickField.get(user)); Field nameFiled = c1.getDeclaredField("name"); //Exception in thread "main" java.lang.IllegalAccessException: Class com.chb.reflectTest.Test1 can not access a member of class com.chb.reflectTest.User with modifiers "private" nameFiled.setAccessible(true); nameFiled.set(user, "oup"); System.out.println(nameFiled.get(user)); } }
通过反射来设置属性的值, 区别属性的修饰范围, 私有的不可以直接设置
会出现访问错误, 也就是java的安全访问机制,报错:
Exception in thread "main" java.lang.IllegalAccessException: Class com.chb.reflectTest.Test1 can not access a member of class com.chb.reflectTest. User with modifiers "private"
我们通过一个方法·来打破java的封装性:
nameFiled.setAccessible(true);
以上就是java之反射基础的内容,更多相关内容请关注PHP中文网(www.php.cn)!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



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

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

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

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

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

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.

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

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
