1.獲取類中的成員屬性信息 運行結果: 2.反射操作成員屬性內容: 運行結果: 如果不解除封裝,會拋如下異常: 3.獲取指定屬性類型: 運行結果: ...
成員屬性保存了一個對象的所有信息,通過反射可以實現成員屬性的賦值與取值操作,本課程主要講解了屬性的直接操作,以及封裝性取消等操作。
1.獲取類中的成員屬性信息
1 package com.youtube.demo; 2 3 import java.lang.reflect.Field;; 4 5 interface IChannelService{ 6 public static final String NAME = "youtube"; 7 } 8 abstract class AbsBase{ 9 protected static final String BASE = "www.youtube.com"; 10 private String info = "Hello, youtube"; 11 } 12 class Member extends AbsBase implements IChannelService{ 13 private String name; 14 private int age; 15 } 16 public class JavaReflectDemo { 17 public static void main(String[] args) { 18 Class <?> cls = Member.class; 19 { 20 Field fields[] = cls.getFields(); 21 for(Field field:fields) { 22 System.out.println(field); 23 } 24 } 25 System.out.println("----------------華麗的分割線------------------"); 26 { 27 Field fields[] = cls.getDeclaredFields(); 28 for(Field field:fields) { 29 System.out.println(field); 30 } 31 } 32 } 33 }
運行結果:
public static final java.lang.String com.youtube.demo.IChannelService.NAME ----------------華麗的分割線------------------ private java.lang.String com.youtube.demo.Member.name private int com.youtube.demo.Member.age
2.反射操作成員屬性內容:
1 package com.facebook.demo; 2 import java.lang.reflect.Field; 3 class Member{ 4 private String name; 5 } 6 public class JavaReflectDemo { 7 public static void main(String[] args) throws Exception { 8 Class<?> cls = Member.class; 9 Object obj = cls.getDeclaredConstructor().newInstance(); 10 Field nameField = cls.getDeclaredField("name"); 11 nameField.setAccessible(true);//解除封裝 12 nameField.set(obj, "小李老師"); 13 System.out.println(nameField.get(obj)); 14 } 15 }
運行結果:
小李老師
如果不解除封裝,會拋如下異常:
Exception in thread "main" java.lang.IllegalAccessException: class com.facebook.demo.JavaReflectDemo cannot access a member of class com.facebook.demo.Member with modifiers "private" at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:355) at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:639) at java.base/java.lang.reflect.Field.checkAccess(Field.java:1075) at java.base/java.lang.reflect.Field.set(Field.java:778) at com.facebook.demo.JavaReflectDemo.main(JavaReflectDemo.java:11)
3.獲取指定屬性類型:
1 package com.facebook.demo; 2 import java.lang.reflect.Field; 3 class Member{ 4 private String name; 5 } 6 public class JavaReflectDemo { 7 public static void main(String[] args) throws Exception { 8 Class<?> cls = Member.class; 9 Object obj = cls.getDeclaredConstructor().newInstance(); 10 Field nameField = cls.getDeclaredField("name"); 11 System.out.println(nameField.getType().getName()); 12 System.out.println(nameField.getType().getSimpleName()); 13 } 14 }
運行結果:
java.lang.String
String