public class ReflectionTest {
public static void main(String[] args) throws Exception {
test001();
}
public static void test001() throws Exception {
Class<Person> clazz = Person.class;
Person p = clazz.newInstance();
//1、调用属性
Field clazzField = clazz.getField("name");
clazzField.set(p, "李四");
System.out.println(clazzField.get(p));
//2、调用方法
Method clazzMethod = clazz.getMethod("showInfo");
clazzMethod.invoke(p);
/*---------------------------------------------------------*/
System.out.println("---------------------------------------------------------");
Class personClass = Class.forName("com.bilibili.cloud.test.Person");
//3、调用私有构造器
Constructor<Person> constructor = personClass.getDeclaredConstructor(String.class, int.class);
//设置构造器访问权限
constructor.setAccessible(true);
Person person = constructor.newInstance("张三", 20);
System.out.println(person.getName());
System.out.println(person.getAge());
//4、调用私有属性
Field ageField = personClass.getDeclaredField("age");
// 设置属性可访问
ageField.setAccessible(true);
ageField.set(person, 21);
System.out.println(ageField.get(person));
//5、调用私有方法
Method showNation = personClass.getDeclaredMethod("showNation", String.class);
//设置方法可访问
showNation.setAccessible(true);
System.out.println(showNation.invoke(person, "北京"));
}
/**
* 反射动态性 1
* @param className
* @return
* @param <T>
* @throws Exception
*/
public <T> T getInstance(String className) throws Exception {
Class<?> clazz = Class.forName(className);
Constructor<?> declaredConstructor = clazz.getDeclaredConstructor();
declaredConstructor.setAccessible(true);
return (T) declaredConstructor.newInstance();
}
/**
* 反射动态性 2
* @param className
* @param methodName
* @return
* @throws Exception
*/
public Object invoke(String className,String methodName ) throws Exception {
Object instance = getInstance(className);
Class<?> clazz = instance.getClass();
//调用私有方法
Method declaredMethod = clazz.getDeclaredMethod(methodName);
declaredMethod.setAccessible(true);
return declaredMethod.invoke(instance);
}
}
Java反射
最新推荐文章于 2025-06-05 14:36:46 发布