Java反射(獲取成員變量+獲取無參成員方法)

一、獲取成員變量(Reflect.java)

1.獲取字節碼對象

2.獲取成員變量

3.給獲取的成員變量賦值

    (1).通過無參構造方法創建對象

    (2).public void set(Object obj,Object value);

package com.test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

public class ReflectTest {
  public static void main(String[] args) throws Exception {
    //獲取字節碼對象
    Class c = Class.forName("com.test.Student");

    //獲取所有的成員變量
    //Field[] fields = c.getFields();
    Field[] fields = c.getDeclaredFields();
    for(Field field : fields){
      System.out.println(field);
    }

    //通過無參構造方法創建對象
    Constructor con = c.getConstructor();//獲取構造方法
    Object obj = con.newInstance();//調用構造方法

    //獲取單個的成員變量
    Field ageField = c.getField("age");//獲取某個共有的
    //給obj對象的ageField字段設置值爲19
    ageField.set(obj,19);
    System.out.println(obj);

    Field numField = c.getField("num");
    numField.set(obj,3);
    System.out.println(obj);

    Field nameField = c.getDeclaredField("name");//獲取某個私有的
    nameField.setAccessible(true);//暴力訪問
    nameField.set(obj,"張三");
    System.out.println(obj);
  }
}

Student.java

package com.test;

public class Student {
  private String name;
  public int age;
  public int num ;

  private Student(String name, int age, int num) {
    this.name = name;
    this.age = age;
    this.num = num;
  }

  public Student() {}

  public Student(String name, int age) {
    this.name = name;
    this.age = age;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

  public void show(){
    System.out.println("show");
  }

  @Override
  public String toString() {
    return name+"--"+age+"--"+num;
  }
}

二、獲取無參成員方法(ReflectFangFa.java)

1.獲取字節碼對象

2.獲取成員方法

3.獲取方法並使用

    (1).獲取構造方法,並創建對象

    (2).獲取單個方法並使用

package com.test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class ReflectFangFa {
  public static void main(String[] args) throws Exception {
    //獲取字節碼對象
    Class c = Class.forName("com.test.Student");
    //獲取成員方法
    //Method[] methods = c.getMethods();//獲取自己的包括父親的公共方法
    Method[] methods = c.getDeclaredMethods();
    for(Method method : methods){
      System.out.println(method);
    }
    //獲取構造方法
    Constructor con = c.getConstructor();
    Object obj = c.newInstance();

    //獲取單個方法並使用
    Method method = c.getMethod("show");
    method.invoke(obj);
  }
}

 

發佈了20 篇原創文章 · 獲贊 32 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章