普通开发模式下的代码是编译时已经设置好参数和属性, 反射是在运行时候动态注入参数属性
Class 类
- 在jvm 中代表 类和接口 的类
- Class 对象具体包含了某个特定类的结构信息
- 通过Class 对象可以获取到类的构造方法、方法、成员变量等
```java public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
//ClassNotFoundException 类找不到
//InstantiationException 非法访问异常
//IllegalAccessException 无法实例化异常
// 指定的类加载到jvm中, 返回对应的class 对象
Class employeeClass = Class.forName("cn.ichief.reflect.entity.Employee");
// 通过默认构造方法实例对象 默认使用无参数的 newInstance 返回的是Object 需要强制转换
Employee employee = (Employee) employeeClass.newInstance();
}
<a name="FANjH"></a>
#### Constructor 构造方法类
- 
```java
try {
Class EmployeeClass = Class.forName("cn.ichief.reflect.entity.Employee");
// 对应构造方法的参数类型
Constructor constructor = EmployeeClass.getConstructor(new Class[]{
Integer.class,
String.class,
Float.class,
String.class
});
Employee employee = (Employee) constructor.newInstance(new Object[]{
100, "ss", 3000f, "yfb"
});
} 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 方法类
```java public static void main(String[] args) {
try {
Class EmployeeClass = Class.forName("cn.ichief.reflect.entity.Employee");
// 对应构造方法的参数类型
Constructor constructor = EmployeeClass.getConstructor(new Class[]{
Integer.class,
String.class,
Float.class,
String.class
});
Employee employee = (Employee) constructor.newInstance(new Object[]{
100, "ss", 3000f, "yfb"
});
Method updateSalaryMethod = EmployeeClass.getMethod("updateSalary", Float.class);
Employee employee1 = (Employee) updateSalaryMethod.invoke(employee, 100f);
} 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();
}
}
<a name="l2DTV"></a>
#### Field 成员变量类
- 
- 
```java
public static void main(String[] args) {
try {
Class EmployeeClass = Class.forName("cn.ichief.reflect.entity.Employee");
// 对应构造方法的参数类型
Constructor constructor = EmployeeClass.getConstructor(new Class[]{
Integer.class,
String.class,
Float.class,
String.class
});
Employee employee = (Employee) constructor.newInstance(new Object[]{
100, "ss", 3000f, "yfb"
});
Field enameField = EmployeeClass.getField("ename");
enameField.set(employee, "ssssd");
String ename = enameField.get(employee).toString();
} 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();
}
}