[关闭]
@liruiyi962464 2018-08-14T04:01:37.000000Z 字数 2305 阅读 510

反射

java

反射

  • 反射可以通过源代码文件获得类的所有信息
  • 反射可以通过字节码文件获得类的所有信息
  • 以前通过类来获得对象,现在可以通过字节码获得对象

获取字节码的方法

  1. //已知一个类名,使用类名.class属性来获得字节码文件
  2. Class c1 = People.class;
  3. //已知字节码文件的完整路径,使用Class.forName("路径")路径出错时会抛出异常
  4. try {
  5. Class c2 = Class.forName("com.fanshe.fanshe");
  6. } catch (ClassNotFoundException e) {
  7. // TODO Auto-generated catch block
  8. e.printStackTrace();
  9. }
  10. //已知一个对象,使用对象名.getClass()来获得该类型的字节码对象
  11. Student s1 = new Student();
  12. Class c3 = s1.getClass();

使用反射创建对象

  1. //无参的
  2. People p1 = (People) c1.newInstance();
  3. p1.name = "战三";
  4. System.out.println(p1.name);
  5. People p2 = (People) c1.getConstructor(new Class[]{})
  6. .newInstance(new Object[]{});
  7. System.out.println(p2);
  8. //有参的
  9. People p3 = (People) c1.getConstructor(new Class[]{String.class,int.class,char.class}).
  10. newInstance("李四",12,'男');
  11. System.out.println(p3.name);

使用反射去操作属性

  1. /*
  2. * 使用反射 去操作属性
  3. * getDeclaredField() 获得当前类型的指定的属性(包括私有的)
  4. * getField() 获得当前类型和父类中指定的公有的属性
  5. *
  6. * getDeclaredFields() 获得当前类型的所有的属性(包括私有的)
  7. * getFields() 获得当前类型和父类中所有的公有的属性
  8. * */
  9. Field[] fields = Student.class.getDeclaredFields();
  10. for (Field f : fields) {
  11. System.out.println(f.getName());
  12. }
  13. //获得指定的属性
  14. Field field = Student.class.getDeclaredField("teacherId");
  15. System.out.println(field.getName());
  16. Student stu1 = new Student();
  17. s1.setTeacherId(100);
  18. //允许使用私有的属性
  19. field.setAccessible(true);
  20. //修改指定对象的属性值
  21. field.set(stu1, 900);
  22. //获取指定对象的属性值
  23. System.out.println(field.get(stu1));

使用反射获得和调用方法

  1. /*
  2. * 使用反射获得和调用方法
  3. * getDeclaredMethod() 获得当前类型的指定的方法(包括私有的)
  4. * getMethod() 获得当前类型和父类中指定的公有的方法
  5. *
  6. * getDeclaredMethods() 获得当前类型的所有的方法(包括私有的)
  7. * getMethods() 获得当前类型和父类中所有的公有的方法
  8. * */
  9. //获得指定的方法
  10. Method method = Student.class
  11. .getDeclaredMethod("study",new Class[]{String.class});
  12. //允许使用方法
  13. method.setAccessible(true);
  14. //使用方法
  15. method.invoke(stu1, new Object[]{"语文"});//si.study("语文")

操作构造方法

  1. /*
  2. * 操作构造方法
  3. * */
  4. Class c5 = C.class;
  5. //获得指定的构造方法
  6. Constructor constructor = c5.getDeclaredConstructor(new Class[]{});
  7. System.out.println(constructor.getName());
  8. //允许使用私有的构造方法
  9. constructor.setAccessible(true);
  10. //使用构造方法创建对象
  11. C c6 = (C) constructor.newInstance(new Object[]{});
  12. c6.a();

用到的类

  1. class People{
  2. public String name;
  3. int age;
  4. private char sex;
  5. public People() {}
  6. public People(String name, int age, char sex) {
  7. this.name = name;
  8. this.age = age;
  9. this.sex = sex;
  10. }
  11. public void eat(String food){
  12. System.out.println("吃"+food);
  13. }
  14. //此处省略get()、set()方法
  15. }
  16. class Student extends People{
  17. public String schoolName;
  18. String classroom;
  19. private int teacherId;
  20. public void study(String type){
  21. System.out.println("学习"+type);
  22. }
  23. //此处省略get()、set()方法
  24. }
  25. class C{
  26. private C(){}
  27. public void a(){
  28. System.out.println("C中的a方法");
  29. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注