反射機制:類中方法及成員變數賦值
阿新 • • 發佈:2019-02-10
- Person.java:
- package test;
- publicclass Person {
- private String name;
- privateint age;
- public Person(){
- }
- }
- Demo.java:
- package test;
- import java.lang.reflect.Field;
- publicclass Demo {
- publicstaticvoid main(String[] args) throws Exception{
-
Class<?> c=null
- Object obj=null;
- try {
- c=Class.forName("test.Person");
- } catch (ClassNotFoundException e1) {
- e1.printStackTrace();
- }
- try {
- obj=c.newInstance();
- } catch (InstantiationException e) {
-
e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- Field nameField=null;
- Field ageField=null;
- nameField=c.getDeclaredField("name");
- ageField=c.getDeclaredField("age");
- nameField.setAccessible(true);
-
nameField.set(obj,"軟體工程"
- ageField.setAccessible(true);
- ageField.set(obj, 20);
- System.out.println("姓名:"+nameField.get(obj));
- System.out.println("年齡:"+ageField.get(obj));
- }
- }
package com.java_reflect3; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * Created by Administrator on 2017/8/17. */ class Hello { private static int id; private static String name; private static String site; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSite() { return site; } public void setSite(String site) { this.site = site; } //自定義方法 public void home(String sex, String age) { System.out.println("性別:" + sex); System.out.println("年齡:" + age); } } public class ListDemoLianXi { public static void main(String[] args) { //類中方法引數賦值測試 //new ListDemoLianXi().MethodTest(); //成員變數賦值測試 variableTest(); } /** * 變數賦值測試 */ public static void variableTest() { //建立本類物件 Hello hello = new Hello(); //建立類的例項 Class c = hello.getClass(); //建立屬性操作物件、具體屬性操作 重要:有幾個屬性必須建立幾個例項物件(要麼在你輸出的時候你有多個屬性的話,呼叫的是一個物件那 必然輸出的是一個物件的值 切記) Field nameField = null; Field siteField = null; try { //getDeclaredField:獲取你自定義變數的名稱 nameField = c.getDeclaredField("name"); siteField = c.getDeclaredField("site"); //屬性name賦值: nameField.setAccessible(true); nameField.set(hello, "諾小華!"); //屬性site賦值: setAccessible(true);作用: 將此物件的 accessible 標誌設定為指示的布林值。值為 true 則指示反射的物件在使用時應該取消 Java 語言訪問檢查。值為 false 則指示反射的物件應該實施 Java 語言訪問檢查。 siteField.setAccessible(true); siteField.set(hello, "天津市津南區小站"); System.out.println("姓名:" + nameField.get(hello)); System.out.println("地址:" + siteField.get(hello)); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } /** * 類中的方法(引數)賦值測試 */ public void MethodTest() { //建立物件 Hello hello1 = new Hello(); //建立Class類物件 Class c = hello1.getClass(); //使用反射進行給具體方法引數賦值 try { Method method = c.getMethod("home", String.class, String.class); //invoke引數錯誤:object is not an instance of declaring class 如果把前面的Object引數傳為字串型別,會丟擲該異常,必須是你實體類的物件即可 method.invoke(hello1, "男生", "2 1");//args可以參多個引數 //打印出的方法中引數的類型別資訊 System.out.println("home內容為:" + method); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } }