反射Reflect
反射介绍及作用
- 反射是在运行时动态访问类与对象的技术
- JDK1.2版本后的高级特性,属于java.lang.reflect
- 大多数Java框架都基于反射实现参数配置、动态注入等特性
反射四个核心类
- Class类
- Constructor构造方法类
- Method方法类
- Field成员变量类
Class类
- Class是JVM中代表"类和接口"的类
- Class对象具体包含了某个特定类的结构信息
- 通过Class对象可获取对应类的构造方法/方法/成员变量
Class核心方法
方法 | 用途 |
---|
Class.forName() | 静态方法 用于获取指定Class对象 |
ClassObj.newInstance() | 通过默认构造方法创建新的对象 |
ClassObj.getConstructor() | 获取指定的public修饰构造方法Constructor对象 |
ClassObj.getMethod() | 获取指定的public修饰方法Method对象 |
ClassObj.getField() | 获取指定的public修饰成员变量Field对象 |
try {
Class employee = Class.forName("com.xs.reflect.Employee");
employee.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
Constructor构造方法类
- Contructor类是对Java类中的构造方法的抽象
- Contructor对象包含了具体类的某个具体构造方法的声明
- 通过Contructor对象调用带参构造方法创建对象
方法 | 用途 |
---|
classObj.getConstructor() | 获取指定public修饰的构造方法对象 |
constructorObj.newInstance() | 通过对应的构造方法创建对象 |
try {
Class eclass = Class.forName("com.xs.reflect.Employee");
Constructor constructor = eclass.getConstructor(new Class[]{
Integer.class, String.class, Float.class, String.class
});
Employee employee = (Employee) constructor.newInstance(100, "李磊", 13000f, "研发部");
System.out.println(employee);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
Method方法类
- Method对象指代某个类中的方法的描述
- Method对象使用classObj.getMethod()方法获取
- 通过Method对象调用指定对象的对应方法
方法 | 用途 |
---|
classObj.getMethod() | 获取指定public修饰的方法对象 |
methodObj.invoke() | 调用指定对象的对应方法 |
public static void main(String[] args) {
try {
Class eclass = Class.forName("com.xs.reflect.Employee");
Constructor constructor = eclass.getConstructor(new Class[]{
Integer.class, String.class, Float.class, String.class
});
Employee employee = (Employee) constructor.newInstance(100, "李磊", 13000f, "研发部");
System.out.println(employee);
Method method = eclass.getMethod("updateSalary", new Class[]{Float.class});
Employee employee1 = (Employee) method.invoke(employee, 2000f);
System.out.println(employee1);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
Field成员变量类
- Field对应某个具体类中的成员变量的声明
- Field对象使用classObj.getField()方法获取
- 通过Field对象可为某对象成员变量赋值/取值
Field类核心方法
方法 | 用途 |
---|
classObj.getField() | 获取指定public修饰的成员变量对象 |
fieldObj.set() | 为某对象指定成员变量赋值 |
fieldObj.get() | 获取某对象指定成员变量数值 |
try {
Class eclass = Class.forName("com.xs.reflect.Employee");
Constructor constructor = eclass.getConstructor(new Class[]{
Integer.class, String.class, Float.class, String.class
});
Employee employee = (Employee) constructor.newInstance(100, "李磊", 13000f, "研发部");
System.out.println(employee);
Field field = eclass.getField("emame");
String ename = (String) field.get(employee);
System.out.println("ename: "+ename);
field.set(employee,"吕小波");
ename = (String) field.get(employee);
System.out.println("ename: " + ename);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
getDeclared系列方法
- getDeclaredConstructor(s)|Method(s)|Field(s) 获取对应对象
- getConstructor(s)|Method(s)|Field(s)只能获取public对象
- 访问非作用域内构造方法 方法 成员变量会抛出异常
try {
Class eclass = Class.forName("com.xs.reflect.Employee");
Constructor constructor = eclass.getConstructor(new Class[]{
Integer.class, String.class, Float.class, String.class
});
Employee employee = (Employee) constructor.newInstance(100, "李磊", 13000f, "研发部");
System.out.println(employee);
Field[] fields = eclass.getDeclaredFields();
for (Field field : fields) {
if (field.getModifiers() == 1) {
Object obj = field.get(employee);
System.out.println(field.getName() + obj);
} else if (field.getModifiers() == 2) {
Method method = eclass.getMethod("get" + field.getName().substring(0, 1).toUpperCase(Locale.ROOT) + field.getName().substring(1));
Object obj = method.invoke(employee);
System.out.println("get方法获取的值"+field.getName() + obj);
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}