1.什么是Java反射
就是正在运行,动态获取这个类的所有信息。
2.反射机制的作用
1,反编译:.class–>.java
2,通过反射机制访问java对象的属性,方法,构造方法等
3.有哪些地方使用到了反射
Jdbc 加载驱动
Spring IOC的底层
Hibernate、Mybatis、等各种框架(基本上各种ORM框架都使用到了反射)
4.为什么要学习反射
1、如果你想了解各种框架的实现原理,反射是必不可少的
2、如果你想封装一个自己的ORM工具、封装一个代码自动生成器,反射技术也是必不可少的
5.为什么已有class文件,却要用反射获得实例对象
1、反射是动态编译,new是静态编译
2、因为java反射可以对私有的构造参数实例化,私有构造参数你是new不出来的
6.反射创建对象有几种方式
答:有三种:
package com.lijie;
public class User {
private String userName;
private String alias;
public static void main(String[] args) {
try {
//第一种反射创建方式方式:
Class<?> forName = Class.forName("com.lijie.User"); //指定加载类
//第二种方式:java中每个类型都有class 属性
Class<?> forName2 = User.class;
//第三种方式:java语言中任何一个java对象都有getClass 方法
User user1 = new User();
Class<?> forName3 = user1.getClass();
} catch (Exception e) {
e.printStackTrace();
}
}
}
7.反射机制的怎么在运行中动态获取所有属性和方法
//第一种反射创建方式:
Class<?> forName = Class.forName("com.lijie.User"); //指定加载类
//反射创建对象,赋值给对象
User user = (User)forName.newInstance();
//获取所有方法名称
Method[] methods = forName.getMethods();
for (Method method:methods) {
System.out.println("User类中的"+method.getName()+"方法");
}
//获取所有属性名称
Field[] fields = forName.getDeclaredFields();
for (Field field:fields) {
System.out.println("User类中的"+field.getName()+"属性");
}
8.私有构成参数使用反射实例化
答:可以(假象如果单例模式别人通过反射创建很多对象怎么办)
package com.lijie;
public class User {
private String userName;
private String alias;
private User(){
}
}
package com.lijie;
import java.lang.reflect.Constructor;
public class Test {
public static void main(String[] args) {
try {
//私有构成参数创建对象:
Constructor<?> cs = User.class.getDeclaredConstructor();
cs.setAccessible(true);
User user=(User)cs.newInstance();
System.out.println(user);
} catch (Exception e) {
System.out.println(e);
}
}
}
9.使用反射为类私有属性赋值
package com.lijie;
public class User {
private String userName;
public String getUserName() {
return userName;
}
}
package com.lijie;
import java.lang.reflect.Field;
public class Test {
public static void main(String[] args) {
try {
// 为user对象私有属性赋值
Class<?> classUser = Class.forName("com.lijie.User");
// 获取到当前的所有属性
Field[] fields = classUser.getDeclaredFields();
for (Field field : fields) {
System.out.println(field.getName());
}
// 初始化对象
User user = (User) classUser.newInstance();
Field declaredField = classUser.getDeclaredField("userName");
// 标记为true 允许反射赋值
declaredField.setAccessible(true);
declaredField.set(user, "李杰");
System.out.println("使用反射机制给id赋值为:"+user.getUserName());
} catch (Exception e) {
System.out.println(e);
}
}
}