生活随笔
收集整理的這篇文章主要介紹了
java 反射详解
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?
反射(Reflection)是Java 程序開發(fā)語言的特征之一,它允許運(yùn)行中的 Java 程序獲取自身的信息,并且可以操作類或?qū)ο蟮膬?nèi)部屬性
?
與反射有關(guān)的類包.
java.lang.reflect.*;
java.lang.Class;
?
下面來看反射到底能做什么:
?
獲取Class對(duì)象 1).Object.getCalss();
2).Class.forName(String)(String的寫法:包名.類名.就會(huì)創(chuàng)建包名.類名對(duì)應(yīng)的那個(gè)對(duì)象)( 注: 1.2只適用于引用類型)
3).封裝類.TYPE返回對(duì)應(yīng)的基本類型的Class對(duì)象.Integer.TYPE對(duì)應(yīng)的是int的Class對(duì)象注:3只適用于基本類型
4).類型.Class。注:4是通用的上面的4種方法,只有方法2是動(dòng)態(tài)的,只要換一個(gè)包就可以了.它具有動(dòng)態(tài)潛質(zhì).所以真正意義的想體現(xiàn)動(dòng)態(tài)編程只能使用方法2.
eg: 1 package com.company;
2
3 public class Main {
4 public static void main(String[] args) throws Exception {
5 Person person = new Person("batty");
6 /* clazz 是儲(chǔ)存Person類內(nèi)容(constructor、field、method等)的類
7 也就是說,Class是儲(chǔ)存類信息的類
8 */
9 Class clazz = Class.forName("com.company.Person");
10 System.out.println("person.getClass(): " + person.getClass()); // class com.company.Person
11 System.out.println("clazz.getClass(): " + clazz.getClass()); // class java.lang.Class
12 System.out.println("clazz.getName(): " + clazz.getName()); // com.company.Person
13 System.out.println("clazz.getClass().getName(): " + clazz.getClass().getName()); // java.lang.Class
14 System.out.println("person.getClass(): "+ person.getClass()); // class com.company.Person
15 System.out.println("Class.forName(\"Person\"): " + Class.forName("com.company.Person")); // class com.company.Person
16 System.out.println("String.TYPE " + Integer.TYPE); // int
17 System.out.println("person.class: " + Person.class ); // class com.company.Person
18 }
19 }
20 class Person{
21 String name;
22 Person(String name) {
23 this .name = name;
24 }
25 } ?
獲取類中的構(gòu)造函數(shù) [獲取構(gòu)造<根據(jù)參數(shù)類型>](使用時(shí)一般用不帶declared的,即藍(lán)色字體)
Constructor <T> getConstructor(Class<?> ... parameterTypes) 返回一個(gè) Constructor 對(duì)象,它反映此 Class 對(duì)象所表示的類的指定公共構(gòu)造方法。
Constructor <?> [] getConstructors() 返回一個(gè)包含某些 Constructor 對(duì)象的數(shù)組,這些對(duì)象反映此 Class 對(duì)象所表示的類的所有公共構(gòu)造方法。 Constructor <T> getDeclaredConstructor(Class<?>... parameterTypes) 返回一個(gè) Constructor 對(duì)象,該對(duì)象反映此 Class 對(duì)象所表示的類或接口的指定構(gòu)造方法。 Constructor <?>[] getDeclaredConstructors() 返回 Constructor 對(duì)象的一個(gè)數(shù)組,這些對(duì)象反映此 Class 對(duì)象表示的類聲明的所有構(gòu)造方法。 ?具體使用例子:利用反射調(diào)用構(gòu)造函數(shù)
1 package Reflect;
2 import java.lang.reflect.Constructor;
3 class Demo() {
4 String name;
5 Demo() {}
6 Demo(String name) {
7 this .name = name;
8 }
9 @Override
10 String toString(){
11 return "["+this .name+"]";
12 }
13 }
14 public class test() {
15 public static void main(String[] args) {
16 Class<?> test = null ;
17 try {
18 test = Class.forName(Reflect.Demo);
19 } catch (Exception e) {
20 e.printStackTrace();
21 }
22 Demo d1 = null ;
23 Demo d2 = null ;
24 Constructor<?> cons[]=test.getConstructors();
25 try {
26 d1=(Demo)cons[0].newInstance();
27 d2=(Demo)cons[1].newInstance("TestDemo");
28 } catch (Exception e){
29 e.printStackTrace();
30 }
31 System.out.println(d1);
32 System.out.println(d2);
33 }
34 } ?
獲取類中的成員函數(shù)(method) [獲取方法<方法名加上參數(shù)類型>](使用時(shí)一般用不帶declared的,即藍(lán)色字體)
Method getMethod(String name, Class <?> ... parameterTypes) 返回一個(gè) Method 對(duì)象,它反映此 Class 對(duì)象所表示的類或接口的指定公共成員方法。
Method[] getMethods() 返回一個(gè)包含某些 Method 對(duì)象的數(shù)組,這些對(duì)象反映此 Class 對(duì)象所表示的類或接口(包括那些由該類或接口聲明的以及從超類和超接口繼承的那些的類或接口)的公共 member 方法。 Method getDeclaredMethod(String name, Class <?>... parameterTypes) 返回一個(gè) Method 對(duì)象,該對(duì)象反映此 Class 對(duì)象所表示的類或接口的指定已聲明方法。 Method[] getDeclaredMethods() 返回 Method 對(duì)象的一個(gè)數(shù)組,這些對(duì)象反映此 Class 對(duì)象表示的類或接口聲明的所有方法,包括公共、保護(hù)、默認(rèn)(包)訪問和私有方法,但不包括繼承的方法。 具體使用例子:利用反射調(diào)用方法 1 package Reflect;
2 import java.lang.reflect.Constructor;
3 class Demo() {
4 String name;
5 Demo() {}
6 Demo(String name) {
7 this .name = name;
8 }
9 void demoTest(String name) {
10 System.out.println(this .name);
11 }
12 @Override
13 String toString(){
14 return "["+this .name+"]";
15 }
16 }
17 public class test() {
18 public static void main(String[] args) {
19 Class<?> test = null ;
20 try {
21 test = Class.forName(Reflect.Demo);
22 } catch (Exception e) {
23 e.printStackTrace();
24 }
25 try {
26 // 調(diào)用Person類中的sayChina方法
27 Method method = test.getMethod("demoTest");
28 method.invoke(test.newInstance());
29 }catch (Exception e) {
30 e.printStackTrace();
31 }
32 }
33 } ?
獲取類中的成員變量(field) [獲取屬性<根據(jù)屬性名>](使用時(shí)一般用是帶declared的,即藍(lán)色字體,因?yàn)閷傩砸话愣际撬接械?
Field getField(String name) 返回一個(gè) Field 對(duì)象,它反映此 Class 對(duì)象所表示的類或接口的指定公共成員字段。 Field[] getFields() 返回一個(gè)包含某些 Field 對(duì)象的數(shù)組,這些對(duì)象反映此 Class 對(duì)象所表示的類或接口的所有可訪問公共字段。 Field getDeclaredField(String name) 返回一個(gè) Field 對(duì)象,該對(duì)象反映此 Class 對(duì)象所表示的類或接口的指定已聲明字段。 Field[] getDeclaredFields() 返回 Field 對(duì)象的一個(gè)數(shù)組,這些對(duì)象反映此 Class 對(duì)象所表示的類或接口所聲明的所有字段。 ?有declared的方法是支持私有,但是不支持繼承,無declared的方法支持繼承,不支持私有,且只能取出public的東西。
?因此取屬性的時(shí)候一般來說是帶declared的,因?yàn)閷傩砸话愣际撬接械?取方法時(shí)一般是不帶declared的,取構(gòu)造時(shí)一般也是不帶declared的.
?
具體使用例子:利用反射獲取字段field
1 package Reflect;
2 import java.lang.reflect.Constructor;
3 class Demo() {
4 String name;
5 Demo() {}
6 Demo(String name) {
7 this .name = name;
8 }
9 @Override
10 String toString(){
11 return "["+this .name+"]";
12 }
13 }
14 public class test() {
15 public static void main(String[] args) {
16 Class<?> test = null ;
17 try {
18 test = Class.forName(Reflect.Demo);
19 } catch (Exception e) {
20 e.printStackTrace();
21 }
22 // 取得本類的全部屬性
23 Field[] field = test.getDeclaredFields();
24 for (int i = 0; i < field.length; i++) {
25 // 權(quán)限修飾符
26 int mo = field[i].getModifiers();
27 String priv = Modifier.toString(mo);
28 // 屬性類型
29 Class<?> type = field[i].getType();
30 System.out.println(priv + " " + type.getName() + " "
31 + field[i].getName() + ";");
32 }
33 }
34 } ?
?寫個(gè)博客寫了大半個(gè)月了,現(xiàn)在才想起把這篇寫完發(fā)布出去,我的第一篇博客就這樣誕生了。。。。。。。。。。。。。。。。。。
?
轉(zhuǎn)載于:https://www.cnblogs.com/luxurytime/p/9115130.html
總結(jié)
以上是生活随笔 為你收集整理的java 反射详解 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。