java反射
反射:就是通过class文件对象,去使用该文件中的成员变量,构造方法,成员方法
反射的使用:
A:通过反射获取构造方法并使用
/* 反射:就是通过class文件对象,去使用该文件中的成员变量,构造方法,成员方法。
一:通过反射获取无参构造方法访问
二:通过反射获取有参构造方法访问*/
//1.获取字节码文件对象
Class aClass = Class.forName("com.user");
//2.获取所有的公共的构造方法
Constructor[] constructors = aClass.getConstructors();
//2.1获取所有的的构造方法(包括私有的)
Constructor[] constructors1 = aClass.getDeclaredConstructors();
//循环输出
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
//3.获取单个构造方法
//3.1返回的是无参构造方法对象
Constructor constructor = aClass.getConstructor();
//3.2返回的是有参构造方法对象
Constructor constructor1 = aClass.getConstructor(String.class, Integer.class);
//4.通过构造方法创建对象(有参括号加参数)
Object object = constructor1.newInstance("柿子", 20);
System.out.println(object);
B:通过反射获取成员变量并使用
//获取字节码对象
Class aClass = Class.forName("com.user");
//获取所有成为成员变量
Field[] fields = aClass.getDeclaredFields();
for (Field field : fields) {
System.out.println(field);
}
//通过构造方法创建对象
Constructor constructor = aClass.getConstructor();//获取构造方法
Object user = constructor.newInstance();//创建对象
//修改单个成员变量的值
Field field = aClass.getDeclaredField("name");//获取单个属性
field.setAccessible(true); //设置私有变量必须要暴力访问
field.set(user, "柿子");//表示把对象user的name属性赋值
System.out.println(user);
C:通过反射获取成员方法并使用
//1.获取字节码对象
Class<?> aClass = Class.forName("com.user");
//获取所有的方法
Method[] methods = aClass.getMethods();//获取自己的包括父亲的公共方法
Method[] methods1 = aClass.getDeclaredMethods();//获取自己的所有的方法(不包括构造方法,getset方法)
for (Method method : methods1) {
System.out.println(method);
}
Object user = aClass.getConstructor().newInstance();//对象
//获取单个方法 参数一是方法名,参数2.3.4...是方法参数类型(私有方法要暴力使用)
//Method method = aClass.getMethod("show", String.class);
Method method = aClass.getDeclaredMethod("show", String.class);
method.setAccessible(true);
//方法使用,返回方法的返回值 参数一是对象名 参数2.3.4...是方法参数值
Object a = method.invoke(user, "柿子");
System.out.println(a);
D:注意事项:
1.在获取私有构造方法,私有属性变量,私有方法时一定要暴力使用
2.在获取私有方法属性构造方法时,方法里面带Declared
method.setAccessible(true);