1 什么是 Java 反射
就是正在运行,动态获取这个类的所有信息。
2 反射机制的作用
- 反编译:.class --> .java
- 通过反射机制访问 java 对象的属性,方法,构造方法等
3 反射机制的应用场景
Jdbc 加载驱动、Spring ioc、一些框架
4 反射创建对象的方式
@Data
public class User {
private String username;
private String address;
public User(){
System.err.println("使用反射技术,执行无参构造函数");
}
public User(String username){
System.err.println("使用反射技术执行有参构造函数,用户名:"+username);
}
}
反射方式创建User类:
- 执行无参构造函数
public class ClassFrom {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
//1.除了new创建对象,还可以使用反射机制创建对象
//2.forName 必须传入 class 类的完整路径
Class<?> forName = Class.forName("com.ljg.model.User");
//3.newInstance 使用无参构造函数,创建对象
Object newInstance = forName.newInstance();
User user = (User) newInstance;
System.err.println("user:"+user);
user.setUsername("LeeJG");
System.err.println(user.getUsername());
//使用反射技术创建对象 和 使用 new 那个效率高? new效率高
}
}
- 执行有参构造函数
public class ClassFrom {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
//使用反射机制执行有参的构造函数,创建对象
Class<?> forName = Class.forName("com.ljg.model.User");
Constructor<?> constructor = forName.getConstructor(String.class);
Object newInstance = constructor.newInstance("LeeJG");
User user = (User) newInstance;
}
}
5 反射机制获取类
反射api:
方法名称 | 作用 |
---|---|
getDeclaredMethods() | 获取该类的所有方法 |
getReturnType() | 获取该方法的返回值 |
getParameterTypes() | 获取传入参数 |
getDeclaredFields() | 获取该类的所有字段 |
setAccessible | 允许访问私有成员 |
获取 User 类的方法及方法返回类型:
public class ClassFrom {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
Class<?> forName = Class.forName("com.ljg.model.User");
//获取该类的所有方法
Method[] declaredMethods = forName.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) {
System.err.println(declaredMethod.getName()+"------"+declaredMethod.getReturnType());
}
}
}
获取 User 类的所有成员属性:
public class ClassFrom {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
Class<?> forName = Class.forName("com.ljg.model.User");
//拿到所有成员属性
Field[] declaredFields = forName.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.err.println(declaredField.getName()+"--------"+declaredField.getType());
}
}
使用反射机制访问User类的私有属性:
public class ClassFrom {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
//可以使用Java反射技术 访问到私有属性
Field field = forName.getDeclaredField("username");
//创建对象
Object object = forName.newInstance();
//允许访问私有成员属性
field.setAccessible(true);
field.set(object,"Mike");
User user = (User) object;
System.err.println(user.getUsername());
}
}