怎样向网站上传照片,做海报找素材的网站,淄博网站排名优化,前端开发工具哪个好一、反射的概述 是在运行状态中#xff0c;对于任意一个类#xff0c;都能够知道这个类的所有属性和方法#xff1b; 对于任意一个对象#xff0c;都能够调用它的任意属性和方法#xff1b; 这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。 通俗的理…一、反射的概述 是在运行状态中对于任意一个类都能够知道这个类的所有属性和方法 对于任意一个对象都能够调用它的任意属性和方法 这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。 通俗的理解 利用反射创建的对象可以无视修饰符调用类里面的内容可以跟配置文件结合起来使用把要创建的对象信息和方法写在配置文件中。 读取到什么类就创建什么类的对象读取到什么方法就调用什么方法此时当需求变更的时候不需要修改代码只要修改配置文件即可。 二、获取字节码文件对象的三种方式 Class这个类里面的静态方法forName“全类名”最常用通过class属性获取通过对象获取字节码文件对象 示例
public class Demo1 {public static void main(String[] args) throws ClassNotFoundException {//1. 第一种方法// 全类名包名类名Class clazz1 Class.forName(ReflectDemo1.Student);System.out.println(clazz1);//2. 第二种方法ClassStudent clazz2 Student.class;System.out.println(clazz2);//3. 第三种方法Student s new Student();Class clazz3 s.getClass();System.out.println(clazz3);}
}public class Student {private String name;private int age;………………
}
三、字节码文件和字节码文件对象 java文件就是我们自己编写的java代码。字节码文件就是通过java文件编译之后的class文件是在硬盘上真实存在的用眼睛能看到的字节码文件对象当class文件加载到内存之后虚拟机自动创建出来的对象。 这个对象里面至少包含了构造方法成员变量成员方法。 反射获取的是什么 字节码文件对象这个对象在内存中是唯一的。 四、获取构造方法 Constructor?[] getConstructors()获得所有的构造只能public修饰 Constructor?[] getDeclaredConstructors()获得所有的构造包含private修饰 ConstructorT getConstructor(Class?... parameterTypes)获取指定构造只能public修饰 ConstructorT getDeclaredConstructor(Class?... parameterTypes)获取指定构造包含private修饰 Constructor类种用于创建对象的方法 T newInstance(Object... initargs)根据指定的构造方法创建对象setAccessible(boolean flag)设置为true表示取消访问检查 示例
public class Demo {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {// 获取class字节码文件Class clazz Class.forName(ReflectDemo2.Student);// 获得所有的构造只能public修饰Constructor[] cons1 clazz.getConstructors();for (Constructor con : cons1) {System.out.println(con);}System.out.println();// 获得所有的构造包含private修饰Constructor[] cons2 clazz.getDeclaredConstructors();for (Constructor con : cons2) {System.out.println(con);}System.out.println();// 获取指定构造只能public修饰// 获取空参构造Constructor con1 clazz.getConstructor();System.out.println(con1);// 获取指定参数的构造Constructor con2 clazz.getConstructor(String.class, int.class);System.out.println(con2);System.out.println();// 获取指定构造包含private修饰Constructor con3 clazz.getDeclaredConstructor(String.class);System.out.println(con3);}
}public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name name;this.age age;}private Student(String name) {this.name name;}protected Student(int age) {this.age age;}
}
五、获取构造方法并创建对象
//首先要有一个javabean类
public class Student {private String name;private int age;public Student() {}public Student(String name) {this.name name;}private Student(String name, int age) {this.name name;this.age age;}//Getter and Setter………………public String toString() {return Student{name name , age age };}
}public class Demo2 {public static void main(String[] args) throws Exception {//1.获取整体的字节码文件对象Class clazz Class.forName(ReflectDemo2.Student);//2.获取空参的构造方法Constructor con clazz.getConstructor();//3.利用空参构造方法创建对象Student stu (Student) con.newInstance();System.out.println(stu);System.out.println();//测试类中的代码//需求2//获取带参构造并创建对象//1.获取整体的字节码文件对象Class clazz Class.forName(ReflectDemo2.Student);//2.获取有参构造方法Constructor con clazz.getDeclaredConstructor(String.class, int.class);//3.临时修改构造方法的访问权限暴力反射con.setAccessible(true);//4.直接创建对象Student stu (Student) con.newInstance(zhangsan, 23);System.out.println(stu);}
}六、获取成员变量并获取值和修改值 Field[] getFields():返回所有成员变量对象的数组只能拿public的 Field[] getDeclaredFields():返回所有成员变量对象的数组存在就能拿到 Field getField(String name):返回单个成员变量对象只能拿public的 Field getDeclaredField(String name):返回单个成员变量对象存在就能拿到 Field类种用于创建对象的方法 void set(Object obj,Object value):赋值Object get(Object obj):获取值 // 学生类
public class Student {private String name;private int age;public String gender;public String address;public Student() {}public Student(String name, int age, String address) {this.name name;this.age age;this.address address;}public Student(String name, int age, String gender, String address) {this.name name;this.age age;this.gender gender;this.address address;}// Getter and Setter , toString();………………
}
public class ReflectDemo {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {Student s new Student(zhangsan,23,广州);Student ss new Student(lisi,24,北京);//需求//利用反射获取成员变量并获取值和修改值//1.获取class对象Class clazz Class.forName(reflectdemo.Student);//2.获取name成员变量//field就表示name这个属性的对象Field field clazz.getDeclaredField(name);//临时修饰他的访问权限field.setAccessible(true);//3.设置(修改)name的值//参数一表示要修改哪个对象的name//参数二表示要修改为多少field.set(s,wangwu);//3.获取name的值//表示我要获取这个对象的name的值String result (String)field.get(s);//4.打印结果System.out.println(result);System.out.println(s);System.out.println(ss);}
}七、获取成员方法并运行 Method[] getMethods():返回所有成员方法对象的数组只能拿public的 Method[] getDeclaredMethods():返回所有成员方法对象的数组存在就能拿到 Method getMethod(String name, Class?... parameterTypes):返回单个成员方法对象只能拿public的 Method getDeclaredMethod(String name, Class?... parameterTypes):返回单个成员方法对象存在就能拿到 Object invoke(Object obj, Object... args) 运行方法 参数一用obj对象调用该方法参数二调用方法的传递的参数如果没有就不写返回值方法的返回值如果没有就不写 // 学生类
public class Student {private String name;private int age;public String gender;public String address;public Student() {}public Student(String name) {this.name name;}private Student(String name, int age) {this.name name;this.age age;}//Getter and Setter , toString()………………
}
public class ReflectDemo {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {//1.获取字节码文件对象Class clazz Class.forName(reflectdemo.Student);//2.获取一个对象//需要用这个对象去调用方法Student s new Student();//3.获取一个指定的方法//参数一方法名//参数二参数列表如果没有可以不写Method eatMethod clazz.getMethod(eat,String.class);//运行//参数一表示方法的调用对象//参数二方法在运行时需要的实际参数//注意点如果方法有返回值那么需要接收invoke的结果//如果方法没有返回值则不需要接收String result (String) eatMethod.invoke(s, 重庆小面);System.out.println(result);}
}