时间:2021-07-01 10:21:17 帮助过:11人阅读
注意:类反射能获取公有的构造方法 如果想要获取到私有的构造方法,就要使用getDeclaredConstructor,如果需要使用私有的构造方法,就要使用暴力访问constructor.setAccessible(true);
关于有参构造方法里面的参数列表怎么填,如果是字符串就String.class 如果是int型就用 int.class
Class c3 = Class.forName("com.test.reflector.Student"); //相当于获取到学生类
创建对象 Student stu = (Student) c3.newInstance(); //获取一个学生对象
获取字节码对象的无参构造 Constructor constructor = c3.getConstructor(); Student s = (Student)constructor.newInstance();
获取字节码对象的有参构造 Constructor constructor = c3.getConstructor(String.class,int.class); Student s = (Student)constructor.newInstance("张三",“11”);
获取所有公有的构造方法 Constructor[] constructors = c3.getConstructors();
获取所有包括私有的构造方法 Constructor[] constructors = c3.getDeclaredConstructors();
通过暴力访问使用私有构造方法
Constructor constructor = c3.getDeclaredConstructor(String.class);
constructor.setAccessible(true); //设置暴力访问
Student s= (Student) constructor.newInstance("aaa"); //不设置暴力访问,编译不会出错,运行会报错
java.lang.IllegalAccessException: Class com.reflector.Demo01 can not access a member of class com.woniuxy.reflector.Student with modifiers "private"
为公有成员赋值
1 Class c1 = Class.forName("com.reflector.Student"); 2 Student s= (Student) c1.newInstance(); 3 Field fieldAge = c1.getField("age"); 4 //给学生对象s的age字段赋值位11 5 fieldAge.set(s, 11); //参数列表(对象,要赋的值)
为私有成员赋值
1 Student s= (Student) c1.newInstance(); 2 Field fieldName = c1.getDeclaredField("name"); 3 fieldName.setAccessible(true); 4 //给学生对象s的私有字段name赋值 5 fieldName.set(s, "aaa"); 6 System.out.println(s);
调用无参方法
1 Class c1 = Class.forName("com.reflector.Student"); 2 Student s= (Student) c1.newInstance(); 3 Method method = c1.getMethod("play"); //调用学生的无参方法play 4 method.invoke(s); //输出这个对象的方法结果
调用有参方法
1 Class c1 = Class.forName("com.reflector.Student"); 2 Student s= (Student) c1.newInstance(); 3 Method method = c1.getMethod("play", String.class); 4 method.invoke(s, "aaa"); //要使用的对象 ,传递的参数
类反射,用于JDBC
标签:关于 err ring Stub exception 成员变量 编译 出错 gen