(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();//按年龄升序排序
}
}