示例类代码:
package JavaDay_5_26.JavaReflection;
/**
* @author myvina@qq.com
* @date 18-5-26 上午9:59
*/
public class Person {
private String name;
private int age;
private String sex;
public Person() {
name = "";
age = 0;
sex = "man";
}
private Person(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Demo类代码:
package JavaDay_5_26.JavaReflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* @author myvina@qq.com
* @date 18-5-26 上午9:54
*/
public class Demo1 {
public static void main(String[] args) {
String className = "JavaDay_5_26.JavaReflection.Person";
try {
//获取Person类对象
Class classPerson = Class.forName(className);
//通过Person类的无参构造函数创建person1对象
Object person1 = classPerson.newInstance();
System.out.println(person1);
//通过Person类的私有有参函数创建person2对象
Constructor constructor1 = classPerson.getDeclaredConstructor(String.class, int.class, String.class);
constructor1.setAccessible(true);
Object person2 = constructor1.newInstance("vina", 21, "man");
System.out.println(person2);
//获取Person类的toString方法,并调用此方法
Method method1 = classPerson.getMethod("toString");
System.out.println(method1.invoke(person2));
//获取Person类的私有字段
Field nameField = classPerson.getDeclaredField("name");
nameField.setAccessible(true);
System.out.println("name = " + nameField.get(person2));
nameField.set(person2, "myvina");
System.out.println("name = " + nameField.get(person2));
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
}
测试结果:
总结:初步尝试了Java反射机制的强大,也对反射机制有了初步的认识。Java反射就是动态获取某类的方法、字段和构造函数等,并对其进行调用或访问。