Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制
要求:1、定义一个Person类,属性包含姓名、年龄;有多个构造方法;包含实例方法study()和eat(),通过反射机制访问类的属性,调用类的方法。
通过反射操作类共有三种方法
① ***Class.forName***方法(包名+类名)
② 类名.class(已知类名)
③ 通过对象引用
以下对三种方法均做出了实现:
package com.gy.s3;
public class Person {
private String name;
private int age;
public Person() {
}
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;
}
public void study(){
System.out.println(this.getName()+"正在学习......");
}
public void eat(){
System.out.println(this.getName()+"正在吃饭......");
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}
package com.gy.s3;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class PersonTest {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {
// 获取类(三种形式)
// 一、 Class.forName方法(包名+类名)
Class C1 = Class.forName("com.gy.s3.Person");
Constructor con = C1.getConstructor(String.class, int.class);
Object obj = con.newInstance("GY", 23);
System.out.println(obj);
// ① 获取study()方法
Method study = C1.getMethod("study");
// 获取对象,执行方法
study.invoke(obj);
// ② 获取eat()方法
Method eat = C1.getMethod("eat");
// 获取对象,执行方法;
eat.invoke(obj);
Method name = C1.getMethod("getName");
System.out.println( name.invoke(obj));
Method age = C1.getMethod("getAge");
System.out.println(age.invoke(obj));
System.out.println("==================================");
// 二、 已知类名(类名.class)
Class<Person> C2 = Person.class;
Constructor con1 = C2.getConstructor(String.class, int.class);
Object obj1 = con1.newInstance("YY",18);
System.out.println(obj1);
// ① 获取study()方法
Method study1 = C1.getMethod("study");
// 获取对象,执行方法
study1.invoke(obj1);
// ② 获取eat()方法
Method eat1 = C1.getMethod("eat");
// 获取对象,执行方法;
eat1.invoke(obj1);
Method name1 = C2.getMethod("getName");
System.out.println( name1.invoke(obj1));
Method age1 = C2.getMethod("getAge");
System.out.println(age1.invoke(obj1));
System.out.println("==================================");
// 三、 通过对象引用
Person person = new Person("SSS", 23);
System.out.println(person);
Class<? extends Person> lass = person.getClass();
Method study2 = lass.getMethod("study");
study2.invoke(person);
Method eat2 = lass.getMethod("eat");
eat2.invoke(person);
Method getName = lass.getMethod("getName");
getName.invoke(person);
Method getAge = lass.getMethod("getAge");
getAge.invoke(person);
}
}
运行结果: