一、概述
反射允许对构造方法、成员变量、成员方法的信息进行编程式访问
二、获取class对象的三种方式
Student实体类
package com.dfh.reflect;
public class Student {
private String name;
private int age;
public Student(String name) {
this.name = name;
}
public Student(int age) {
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 Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student() {
}
private void eat(String foot) {
System.out.println("吃" + foot);
}
private void eat(String foot, int num) {
System.out.println("吃" + num + "个" + foot);
}
}
实现类
//第一种、class.forName(全类名)
Class class1 = Class.forName("com.dfh.reflect.Student");
//第二种、类名.class
Class class2 = Student.class;
//第三种、对象.getClass()
//当我们有了这个类的对象时才能使用
Student student = new Student();
Class class3 = student.getClass();
三、获取构造方法
Constructor name = class1.getDeclaredConstructor(String.class);
// 只能获取公共的(public)
Constructor[] constructors = class1.getConstructors(String.class);
Constructor nameAge = class1.getDeclaredConstructor(String.class, int.class);
// 获取权限修饰符
int modifiers = class1.getModifiers();
System.out.println(modifiers);
System.out.println(Modifier.toString(modifiers));
// 临时取消权限的校验
nameAge.setAccessible(true);
// 新建对象
Student me = (Student) nameAge.newInstance("我的名字", 3);
System.out.println(me);
四、获取成员变量
Class class2 = Student.class;
Field[] declaredFields = class2.getDeclaredFields();
for (Field s : declaredFields) {
System.out.println(s);
}
// 只能获取公共的
// Field field = class2.getField(String.class);
String name1 = class2.getName();
System.out.println(name1);
String typeName = class2.getTypeName();
System.out.println(typeName);
// 获取单个的成员变量
Field name2 = class2.getDeclaredField("name");
// 临时取消权限的校验
name2.setAccessible(true);
Student sao = new Student("sao", 1);
String o = (String) name2.get(sao);
System.out.println(o);
// 修改对象里面的值
name2.set(sao,"saoer");
System.out.println(sao);
五、获取成员方法
Student student = new Student();
Class class3 = student.getClass();
// 获取单个公共的成员方法
// Method name3 = class3.getMethod("name");
// 获取所有成员方法
Method[] methods = class3.getMethods();
for (Method m : methods) {
System.out.println(m);
}
Method eat = class3.getDeclaredMethod("eat", String.class);
System.out.println(eat);
Student student1 = new Student();
eat.setAccessible(true);
eat.invoke(student1, "香蕉");
本文介绍了Java中的反射机制,包括通过class.forName、类名.class及对象.getClass()获取Class对象,然后详细讲解了如何获取构造方法、成员变量及其权限,以及如何修改私有成员。此外,还展示了获取和调用成员方法,包括私有方法的访问。

1276

被折叠的 条评论
为什么被折叠?



