需要掌握 调用运行时类中指定的结构: 属性 方法 构造器
package com.atguigu.java2;
import com.atguigu.java1.Person;
import org.junit.Test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 调用运行时类中指定的结构: 属性 方法 构造器
*
* @author liangqichen
* @create 2021-10-30 14:21
*/
public class ReflectionTest {
/*
不理想
*/
@Test
public void testField() throws Exception {
Class clazz = Person.class;
// 创建运行时类的对象
Person p = (Person) clazz.newInstance();
// 获取指定的属性 : 要求运行时类中属性声明为public的
// 通常不采用此方式
Field id = clazz.getField("age");
// 设置当前属性的值
// set() 参数1:指明设置那个对象的属性 参数2:将此属性设置为多少
id.set(p, 1001);
/*
获取当前属性的值
get() :参数1 : 获取哪个对象的当前属性值
*/
int pId = (int) id.get(p);
System.out.println(pId); // 1001
}
/*
如何操作运行时类中指定的属性 --- 需要掌握
*/
@Test
public void testField1() throws Exception {
// 创建运行时类的对象
Class clazz = Person.class;
Person p = (Person) clazz.newInstance();
// 1. getDeclaredField(String fieldName) : 获取指定变量名的属性
Field name = clazz.getDeclaredField("name");
// 2. 保证当前属性是可访问的
name.setAccessible(true);
// 3. 获取、设置指定对象的此属性值
name.set(p, "Tom");
System.out.println(name.get(p));
}
/*
如何操作运行时类中指定的方法 --- 需要掌握
*/
@Test
public void testMethod() throws Exception {
Class clazz = Person.class;
//创建运行时类的对象
Person p = (Person) clazz.newInstance();
/*
1. 获取指定的某个方法
getDeclaredMethod() :参数1 指明获取方法的名称 参数2:指明获取的方法的形参列表
*/
Method show = clazz.getDeclaredMethod("show", String.class);
/*
2. 保证当前属性是可访问的
*/
show.setAccessible(true);
/*
3. 调用方法 invoke() : 参数1 方法的调用者 参数2:给方法形参赋值的实参
invoke() 的返回值即为对应类中调用的方法的返回值
*/
Object returnValue = show.invoke(p,"CHN"); // Striung nation = p.show("CHN");
System.out.println(returnValue); // CHN
System.out.println("**********如何调用静态方法***********");
// public static void showDesc() 调用静态方法
Method showDesc = clazz.getDeclaredMethod("showDesc");
showDesc.setAccessible(true);
// 如果调用的运行时类中的方法没有返回值,则此invoke()返回null
Object returnVal = showDesc.invoke(Person.class);
System.out.println(returnVal); // null
}
/*
如何调用运行时类中指定的构造器 不常用
*/
@Test
public void testConstructor() throws Exception {
Class clazz = Person.class;
// pivate Person(String name)
// 1. 获取指定的构造器
// getDeclaredConstructor() : 参数 :指明构造器的参数列表
Constructor constructor = clazz.getDeclaredConstructor(String.class);
// 2. 保证此构造器是可访问的
constructor.setAccessible(true);
// 3. 调用此构造器,创建运行时类的对象
Person person = (Person) constructor.newInstance("Tom");
System.out.println(person); // Person{name='Tom', age=0, id=0}
}
}
本文详细介绍了如何使用Java反射机制来操作运行时类的属性、方法和构造器。通过`getField()`、`getDeclaredField()`、`setAccessible()`、`invoke()`等方法,实现了对类成员的访问与调用,包括私有成员的访问。此外,还展示了如何通过`getDeclaredMethod()`和`getDeclaredConstructor()`获取并调用指定的方法和构造器。
169

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



