(1)反射獲取成員變量
import java.lang.reflect.Field;
/*
反射:
(1) 獲取Class類對象: Class class;
(2) 獲取成員變量
Field[] getFields();獲取用public修飾的成員變量
Field getField(String name);獲取用public修飾的指定方法名的成員變量
Field[] getDeclaredFields();獲取所有成員變量,包含private修飾的變量
Field getDeclaredField(String name);獲取指定變量名稱的成員變量,可以獲取private修飾的成員變量
對成員變量進行賦值和取值
void set(Object obj,Object value);對成員變量進行賦值
get(Object obj);獲取成員變量的值
對私有成員變量進行操作時,需要忽略訪問修飾符的安全檢查。代碼如下
setAccessible(true);忽略暴力反射
*/
public class Demo {
//反射機制獲取成員變量的方法案例
public static void main(String[] args) throws Exception {
//獲取person類的class對象
Class<person> personClass = person.class;
//獲取public修飾的成員變量
Field[] fields = personClass.getFields();
for (Field field : fields) {
System.out.println(field);
}
//獲取指定名稱的成員變量
Field a = personClass.getField("a");
//對指定名稱的成員變量進行操作,get和set方法中必須傳入成員變量所在的對象
person person = new person();
a.set(person,"AA");//對person對象中的成員變量a進行賦值
Object o = a.get(person);//獲取person對象中成員變量a的值
System.out.println(o);
//獲取所有的成員變量
Field[] declaredFields = personClass.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
}
//獲取指定名稱的成員變量(任何訪問修飾符)
Field name = personClass.getDeclaredField("name");
//忽略訪問修飾符安全權限
name.setAccessible(true);
name.set(person,"BB");//對person對象中的成員變量name進行賦值
System.out.println(name.get(person));
}
}
(2)反射獲取構造器及成員方法
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
/**
* 反射
* 獲取構造方法
* (1)Constructor<?>[] getConstructors();獲取類的字節碼文件中所有的public修飾的構造器,之後調用newInstance獲取對象
* (2)Constructor<T> getConstructor(類<?>... parameterTypes)獲取類的字節碼文件中指定的public修飾的構造器
*
* (3)Constructor<?>[] getDeclaredConstructors();
* (4)Constructor<T> getDeclaredConstructor(類<?>... parameterTypes);
*
* 常用方法
* (1)newInstance();用於創建對象
*
* 獲取成員方法
* (1)Method[] getMethods();獲取類的字節碼文件中的所有public修飾的成員方法
* (2)Method getMethod(String name,類<?>... parameterTypes);
*
* (3)Method[] getDeclaredMethods();
* (4)Method getDeclaredMethod(String name,類<?>... parameterTypes);
*
* 常用方法
* (1)Object invoke(Object obj,Object... args);執行獲取到的method方法
* (2)getName();獲取方法名稱
*/
public class Demo01 {
public static void main(String[] args) throws Exception {
//獲取person的calss對象
Class<person> personClass = person.class;
//獲取構造方法
Constructor<person> constructor = personClass.getConstructor(String.class, int.class);
//利用newInstance()方法獲取一個對象
person person = constructor.newInstance("AA", 18);
System.out.println(person);
//獲取字節碼文件中的成員方法
Method eat = personClass.getMethod("eat");
person p = new person();
//執行invoke方法
eat.invoke(p);
}
}
person對象
package com.njau.day04;
import java.io.Serializable;
import java.util.Objects;
public class person implements Comparable<person>, Serializable {
public String a;
private String name;
private int age;
public person() {
}
public person(String name) {
this.name = name;
}
public person(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;
}
@Override
public boolean equals(Object o) {
System.out.println(getClass());//通過反射獲取當前類的類型,即person
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
person person = (person) o;
return age == person.age &&
Objects.equals(name, person.name);//使用Objects中的equals方法,可以避免空指針異常
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(person o) {
return this.getAge()-o.getAge();//按年齡升序排序
}
}