目录
一、实体类准备
package ReflexStudy;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name){
this.name = name;
}
protected Student(int age){
this.age = age;
}
private Student(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;
}
private String study(String book){
System.out.println("i am study..." + book);
return "i am ok";
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
二、获取Class对象(三种方法)
1、通过Class.forName("全类名")
public static void main(String[] args) throws ClassNotFoundException {
Class aClass = Class.forName("ReflexStudy.Student");
System.out.println(aClass);
}
2、通过类名.class
public static void main(String[] args) throws ClassNotFoundException {
Class aClass = Student.class;
System.out.println(aClass);
}
3.通过对象.getClass
public static void main(String[] args) throws ClassNotFoundException {
Student student = new Student();
System.out.println(student.getClass());
}
三、获取构造方法
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
Class aClass = Class.forName("ReflexStudy.Student");
System.out.println(aClass.getConstructor());//public ReflexStudy.Student()
for (Constructor constructor : aClass.getConstructors()) {
System.out.println(constructor);
}//public ReflexStudy.Student(java.lang.String)
// public ReflexStudy.Student()
System.out.println(aClass.getDeclaredConstructor(String.class));//public ReflexStudy.Student(java.lang.String)
for (Constructor declaredConstructor : aClass.getDeclaredConstructors()) {
System.out.println(declaredConstructor);
}//private ReflexStudy.Student(java.lang.String,int)
//protected ReflexStudy.Student(int)
//public ReflexStudy.Student(java.lang.String)
//public ReflexStudy.Student()
}
通过构造方法创建对象
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
Class aClass = Class.forName("ReflexStudy.Student");
Constructor constructor = aClass.getDeclaredConstructor(String.class, int.class);//获取有两个参数的构造方法
System.out.println(constructor.getModifiers());//2 代表获取的构造方法由private修饰
constructor.setAccessible(true); //取消权限校验 如果不是private修饰的构造方法则不许要这句
Student student = (Student)constructor.newInstance("张三", 18);
System.out.println(student);//Student{name='张三', age=18}
}
四、获取属性
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
Class aClass = Class.forName("ReflexStudy.Student");
for (Field field : aClass.getDeclaredFields()) {
System.out.println(field);
}//private java.lang.String ReflexStudy.Student.name
//private int ReflexStudy.Student.age
Field name = aClass.getDeclaredField("name");//注意这里不能使用getField因为name被private修饰
System.out.println(name);//private java.lang.String ReflexStudy.Student.name
}
通过反射获取对象name属性和修改对象name属性
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
Class aClass = Class.forName("ReflexStudy.Student");
Field name = aClass.getDeclaredField("name");
Student student = new Student("张三");
name.setAccessible(true);//原因与构造函数相同 name由private修饰
Object o = name.get(student);//获取对象name
System.out.println(o);//张三
name.set(student, "李四");//修改对象name
System.out.println(student);//Student{name='李四', age=0}
}
五、获取成员方法
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
Class aClass = Class.forName("ReflexStudy.Student");
for (Method declaredMethod : aClass.getDeclaredMethods()) {
System.out.println(declaredMethod);
}//public void ReflexStudy.Student.setAge(int)....
Method getName = aClass.getDeclaredMethod("getName");
System.out.println(getName);//public java.lang.String ReflexStudy.Student.getName()
}
调用成员方法
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Class aClass = Class.forName("ReflexStudy.Student");
Method study = aClass.getDeclaredMethod("study", String.class);
Student student = new Student();
study.setAccessible(true);
System.out.println(study.invoke(student, "鲁滨逊漂流记"));//i am study...鲁滨逊漂流记
//i am ok
}