这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战
2.8 获取运行时类的完整结构
package refection;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
// 获得类的名称
public class Test07 {
@SuppressWarnings("all")
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
Class c1 = Class.forName("refection.User");
//获得类的名字
System.out.println(c1.getName()); // 包名 + 类名
System.out.println(c1.getSimpleName()); // 类名
// 获得类的属性
System.out.println("————————————————————————————————————————————");
Field[] fields = c1.getFields(); // 只能找到public属性
System.out.println(fields);
System.out.println("—————————————————————————————————————————————");
fields = c1.getDeclaredFields(); //找到全部的属性
for (Field field : fields) {
System.out.println(field);
}
System.out.println("——————————————————————————————————————————————");
// 获得指定属性的值
Field name = c1.getDeclaredField("name"); // getDeclaredField 需要输入一个属性字段
System.out.println(name);
System.out.println("——————————————————————————————————————————————");
//获得类的方法
Method []methods = c1.getMethods();
for (Method method : methods) {
System.out.println("正常的:" + method);
}
methods = c1.getDeclaredMethods();
for (Method method : methods) {
System.out.println("getDeclaredMethods:" + method);
}
// 获取指定方法
Method getName = c1.getMethod("getName",null);
Method setName = c1.getMethod("setName", String.class);
System.out.println(getName);
System.out.println(setName);
// 获取构造器
Constructor[] constructors = c1.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
Constructor []constructors1 = c1.getDeclaredConstructors();
for (Constructor constructor : constructors1) {
System.out.println( "#" + constructor);
}
Constructor constructor = c1.getDeclaredConstructor(String.class , int.class , int.class);
System.out.println("指定:" + constructor); // 指定全参构造
constructor = c1.getDeclaredConstructor();
System.out.println("指定:" + constructor); // 指定无参构造
}
}
2.9 动态创建对象执行方法
-
首先需要创建对象
- Class c1 = Class.forName("位置") ;
-
再者运用无参构造或者全参构造创建一个对象
- 无参:newInstance();
- 全参:获取构造器,填入参数
-
通过反射调用普通的方法
-
获取一个方法: invoke("对象" ,"方法的值");
-
获取属性Field
- 解决权限不够的问题:关闭安全属性
- 变量名.setAccessible(true);
- 传入值:属性名.set();
-
package refection;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
// 反射的综合应用
public class Test08 {
/**
* - 首先需要创建对象
* - Class c1 = Class.forName("位置") ;
* - 再者运用无参构造或者全参构造创建一个对象
* - 无参:newInstance();
* - 全参:获取构造器,填入参数
* - 通过反射调用普通的方法
* - 获取一个方法: invoke("对象" ,"方法的值");
* - 获取属性Field
* - 解决权限不够的问题:关闭安全属性
* - 变量名.setAccessible(true);
* - 传入值:属性名.set();
* */
@SuppressWarnings("all")
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
// 创建对象
Class c1 = Class.forName("refection.User");
// 无参构造
User user = (User)c1.newInstance();
System.out.println(user);
// 全参构造
Constructor constructor = c1.getDeclaredConstructor(String.class , int.class , int.class);
User user1 = (User)constructor.newInstance("张三" , 1 , 18);
System.out.println(user1);
// 通过反射调用方法
User user2 = (User)c1.newInstance();
Method setName = c1.getDeclaredMethod("setName", String.class);
setName.invoke(user2 , "张三2");
System.out.println(user2.getName());
// 通过反射操作属性
User user3 = (User)c1.newInstance();
Field name = c1.getDeclaredField("name");
name.setAccessible(true);
name.set(user3 , "张三3");
System.out.println(user3.getName());
}
}