package com.study.reflex;
public class Person extends Father implements StudyInterface {
private String username;
private String password;
public String a;
protected String b;
String c;
private String d;
private Integer age;
private int money;
public void eat() {
System.out.println("eat...");
}
public void eat(String food) {
System.out.println("eat..." + food);
}
private void sport() {
System.out.println("sport...");
}
public Person() {
}
public Person(String username, Integer age) {
this.username = username;
this.age = age;
}
public Person(String username, int money) {
this.username = username;
this.money = money;
}
public Integer getAge() {
return age;
}
public int getMoney() {
return money;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public String getA() {
return a;
}
public String getB() {
return b;
}
public String getC() {
return c;
}
public String getD() {
return d;
}
@Override
public void IStudy() {
System.out.println("IStudy...");
}
@Override
public String toString() {
return "Person{" +
"username='" + username + ''' +
", password='" + password + ''' +
", a='" + a + ''' +
", b='" + b + ''' +
", age=" + age +
", money=" + money +
'}';
}
}
Father类
package com.study.reflex;
public class Father {
private String fatherUsername;
private String fatherPassword;
public String getFatherUsername() {
return fatherUsername;
}
public String getFatherPassword() {
return fatherPassword;
}
@Override
public String toString() {
return "Father{" +
"fatherUsername='" + fatherUsername + ''' +
", fatherPassword='" + fatherPassword + ''' +
'}';
}
}
StudyInterface接口
package com.study.reflex;
public interface StudyInterface {
public void IStudy();
}
获取字节码的三种方式
- Class.forName(“全类名”)
- 类名.class
- 对象.getClass()
并且通过这三种方式获得的字节码对象是相同的。
代码:
package com.study.reflex;
public class Test {
public static void main(String[] args) throws Exception {
Class class1 = Class.forName("com.study.reflex.Person");
Class class2 = Person.class;
Person person = new Person();
Class class3 = person.getClass();
// true
System.out.println(class1 == class2);
// true
System.out.println(class1 == class3);
}
}
2 成员变量Field
获取成员变量的目的主要有两个:
1.获取值
2.设置值
package com.study.reflex;
import java.lang.reflect.Field;
public class Test {
public static void main(String[] args) throws Exception {
Class personClass = Person.class;
// 获取所有public修饰符的成员变量
Field[] fields = personClass.getFields();
for (Field field : fields) {
System.out.println(field);
}
// 获取指定名称的public修饰符成员变量
Field a = personClass.getField("a");
// 设置值
Person person = new Person();
a.set(person, "123456");
// 获取值
Object value = a.get(person);
System.out.println(value);
}
}
结果
package com.study.reflex;
import java.lang.reflect.Field;
public class Test {
public static void main(String[] args) throws Exception {
Class personClass = Person.class;
// 获取所有成员变量
Field[] declaredFields = personClass.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
}
// 获取指定名称的成员变量
Field username = personClass.getDeclaredField("username");
Field money = personClass.getDeclaredField("money");
// 对私有成员变量进行设置值、获取值之前,需要设置,称为暴力反射
money.setAccessible(true);
username.setAccessible(true);
// 设置值
Person person = new Person();
username.set(person, "admin");
money.setInt(person, 10000);
// 获取值
Object value = username.get(person);
System.out.println(value);
System.out.println(person);
}
}
结果
代码
package com.study.reflex;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
public class Test {
public static void main(String[] args) throws Exception {
Class personClass = Person.class;
// 获取有参构造器
Constructor constructor = personClass.getConstructor(String.class, int.class);
Constructor constructor1 = personClass.getConstructor(String.class, Integer.class);
// 通过有参构造器创建对象
Object o = constructor.newInstance("123456", 99);
System.out.println(o);
Object o1 = constructor1.newInstance("654321", 66);
System.out.println(o1);
// 获取无参构造器
Constructor constructor2 = personClass.getConstructor();
// 通过无参构造器创建对象
Object o2 = constructor2.newInstance();
System.out.println(o2);
// 也可以通过该方法直接创建无参构造器
Object o3 = personClass.newInstance();
System.out.println(o3);
}
}
结果
package com.study.reflex;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws Exception {
Class personClass = Person.class;
// 获取自身的public成员方法和所有父类的public方法
Method[] methods = personClass.getMethods();
for (Method method : methods) {
System.out.println(method);
}
System.out.println("==================");
// 获取指定名称的public成员方法,没参数
Method eat = personClass.getMethod("eat");
Person person = new Person();
// 调用
eat.invoke(person);
System.out.println("==================");
// 获取指定名称的public成员方法,带参数
Method eat1 = personClass.getMethod("eat", String.class);
eat1.invoke(person, "饭");
System.out.println("==================");
// 获取私有的成员方法,指定名称
Method sport = personClass.getDeclaredMethod("sport");
// 调用私有的成员方法,需要加上
sport.setAccessible(true);
sport.invoke(person);
}
}
结果
package com.study.reflex;
public class Test {
public static void main(String[] args) throws Exception {
Class personClass = Person.class;
System.out.println("全类名:" + personClass.getName());
System.out.println("父类:" + personClass.getSuperclass().getName());
// 实现了什么接口
Class[] interfaces = personClass.getInterfaces();
for (Class anInterface : interfaces) {
System.out.println(anInterface);
}
}
}
结果



