java進階(41)--反射機制

文檔目錄:java

1、反射機制的做用this

2、反射機制相關類spa

3、獲取class的三種方式code

4、經過反射實例化對象對象

5、經過讀屬性文件實例化對象blog

6、經過反射機制訪問對象屬性內存

7、經過反射機制調用方法資源

---------------------------------------分割線:正文--------------------------------------------------------文檔

1、反射機制的做用get

一、經過java語言中反射機制能夠操做字節碼文件

二、經過反射機制能夠操做代碼片斷(class文件)

 

2、反射機制相關類

一、對應的包:java.lang.reflect.*

二、有哪些重要的類:

java.lang.class --> 表明整個字節碼文件,代碼一個類型,代碼整個類

java.lang.reflect.Method --> 表明字節碼中的方法字節碼,代碼類中構造方法

java.lang.reflect.Constructor --> 表明字節碼中構造方法字節碼,表明類中構造方法

java.lang.reflect.Field -->表明類中屬性

 

3、獲取class的三種方式

一、forName()

 1 package com.bk.java.Test41.reflect01;  2 
 3 public class ReflectTest01 {  4     public static void main(String[] args) throws ClassNotFoundException {  5         Class c1=Class.forName("java.lang.String");  6         Class c2=Class.forName("java.util.Date");  7         Class c3=Class.forName("java.lang.Integer");  8  System.out.println(c1);  9  System.out.println(c2); 10  System.out.println(c3); 11  } 12 }

查看執行結果:

class java.lang.String class java.util.Date class java.lang.Integer

 

二、getClass()

 1 package com.bk.java.Test41.reflect01;  2 
 3 public class ReflectTest02 {  4     public static void main(String[] args) throws ClassNotFoundException {  5         String s="abc";  6         Class c1=Class.forName("java.lang.String");  7         Class x=s.getClass();  8         //內存地址一致,都指向方法區中的字節碼
 9         System.out.println(x==c1); 10  } 11 }

執行結果爲true

 

三、.class屬性

 1 package com.bk.java.Test41.reflect01;  2 
 3 public class ReflectTest03 {  4     public static void main(String[] args) {  5         String s="123";  6         Class y=s.getClass();  7         Class z=String.class;  8         System.out.println(y==z);  9  } 10 }

執行結果爲true

 

4、經過反射實例化對象

 1 package com.bk.java.Test41.reflect01;  2 
 3 public class ReflectTest04 {  4     public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {  5         Class c=Class.forName("com.bk.java.Test41.reflect01.User");  6         //必須保證User類包含無參構造的方法,調用User類的無參構造方法,完成實例對象的建立
 7         Object obj= c.newInstance();  8  System.out.println(obj);  9  } 10 }

查看運行結果

調用了User類的無參構造方法
com.bk.java.Test41.reflect01.User@1b6d3586

 

5、經過讀屬性文件實例化對象

一、經過i/o流讀取classinfo.properties

 配置文件:

classinfo.properties:

className=com.bk.java.Test41.reflect01.User
 1 package com.bk.java.Test41.reflect01;  2 
 3 import java.io.FileNotFoundException;  4 import java.io.FileReader;  5 import java.io.IOException;  6 import java.util.Properties;  7 
 8 public class ReflectTest05 {  9     public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException { 10         //經過I/O流讀取classinfo.properties文件
11         FileReader reader=new FileReader("src/com/bk/java/Test41/reflect01/classinfo.properties"); 12         //建立屬性類對象
13         Properties pro=new Properties(); 14  pro.load(reader); 15         //關閉流
16  reader.close(); 17         //經過key獲取value
18         String className=pro.getProperty("className"); 19  System.out.println(className); 20         //經過反射機制實例化對象
21         Class c=Class.forName(className); 22         Object obj=c.newInstance(); 23  System.out.println(obj); 24  } 25 }

查看執行結果:

com.bk.java.Test41.reflect01.User
調用了User類的無參構造方法
com.bk.java.Test41.reflect01.User@1b6d3586

修改配置文件後再次調用查看結果

className=java.util.Date
java.util.Date Mon Apr 05 17:21:25 CST 2021

 

二、以流的形式直接返回

 1 package com.bk.java.Test41.reflect01;  2 
 3 import java.io.FileNotFoundException;  4 import java.io.FileReader;  5 import java.io.IOException;  6 import java.util.Properties;  7 
 8 public class ReflectTest06 {  9     public static void main(String[] args) throws IOException { 10         String path=Thread.currentThread().getContextClassLoader().getResource("com/bk/java/Test41/reflect01/classinfo.properties").getPath(); 11         FileReader reader=new FileReader(path); 12         Properties pro=new Properties(); 13  pro.load(reader); 14  reader.close(); 15         //經過key獲取value
16         String className=pro.getProperty("className"); 17  System.out.println(className); 18  } 19 }

查看返回結果:返回結果同上

java.util.Date

改進代碼以下:

package com.bk.java.Test41.reflect01; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class ReflectTest07 { public static void main(String[] args) throws IOException { InputStream in=Thread.currentThread().getContextClassLoader().getResourceAsStream("com/bk/java/Test41/reflect01/classinfo.properties"); Properties pro=new Properties(); pro.load(in); in.close(); //經過key獲取value
        String className=pro.getProperty("className"); System.out.println(className); } }

三、使用資源綁定器:

package com.bk.java.Test41.reflect01; import java.util.ResourceBundle; public class ResourceBundleTest { public static void main(String[] args) { ResourceBundle bundle=ResourceBundle.getBundle("com/bk/java/Test41/reflect01/classinfo"); String className=bundle.getString("className"); System.out.println(className); } }

查看運行結果:

java.util.Date

 

6、經過反射機制訪問對象屬性

建立一個Student類

 1 package com.bk.java.Test41.reflect02;  2 
 3 public class Student {  4     public int no;  5     private String name;  6     protected int age;  7     boolean sex;  8 
 9     public Student() { 10  } 11 
12     public int getNo() { 13         return no; 14  } 15 
16     public void setNo(int no) { 17         this.no = no; 18  } 19 
20     public String getName() { 21         return name; 22  } 23 
24     public void setName(String name) { 25         this.name = name; 26  } 27 
28     public int getAge() { 29         return age; 30  } 31 
32     public void setAge(int age) { 33         this.age = age; 34  } 35 
36     public boolean isSex() { 37         return sex; 38  } 39 
40     public void setSex(boolean sex) { 41         this.sex = sex; 42  } 43 }

經過反射機制訪問對象屬性

 1 package com.bk.java.Test41.reflect02;  2 
 3 import java.lang.reflect.Field;  4 
 5 public class ReflectTest01 {  6     public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException {  7         Class studentClass=Class.forName("com.bk.java.Test41.reflect02.Student");  8         Object obj=studentClass.newInstance();  9         //獲取no屬性經過屬性name
10         Field noField=studentClass.getDeclaredField("no"); 11         //給obj對象的no屬性賦值
12         noField.set(obj,11111); 13         //讀取屬性的值
14  System.out.println(noField.get(obj)); 15  } 16 }

查看輸出結果

11111

 

7、經過反射機制調用方法

原始方法:

package com.bk.java.Test41.reflect03; public class ReflectTest { public static void main(String[] args) { //原始方法調用UserSevice.login方法
        UserService userService=new UserService(); boolean loginSuccess=userService.login("admin","123"); System.out.println(loginSuccess?"登陸成功":"登陸失敗"); } }

經過反射機制調用:

 1 package com.bk.java.Test41.reflect03;  2 
 3 import java.lang.reflect.InvocationTargetException;  4 import java.lang.reflect.Method;  5 
 6 public class ReflectTest {  7     public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {  8 //        //原始方法調用UserSevice.login方法  9 // UserService userService=new UserService(); 10 // boolean loginSuccess=userService.login("admin","123"); 11 // System.out.println(loginSuccess?"登陸成功":"登陸失敗");
12         Class userServiceClass =Class.forName("com.bk.java.Test41.reflect03.UserService"); 13         //建立實例對象
14         Object obj=userServiceClass.newInstance(); 15         //獲取Method
16         Method loginMethod=userServiceClass.getDeclaredMethod("login", String.class, String.class); 17         //調用方法
18         Object retvalue=loginMethod.invoke(obj,"admin","123"); 19  System.out.println(retvalue); 20  } 21 }

查看運行結果:

true
相關文章
相關標籤/搜索