java增强:反射机制,内省机制

旧城等待, 2022-05-12 06:34 344阅读 0赞
  1. 反射机制概念
  2. 发射的使用场景
  3. 内省机制的使用

part1 :反射机制( jdk提供的一套api, 用于动态创建对象 )

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2V5ZW9mZWFnbGU_size_16_color_FFFFFF_t_70


" class="reference-link">watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2V5ZW9mZWFnbGU_size_16_color_FFFFFF_t_70 1

part2: 反射的使用——两个对象间属性值的复制

(浅copy: 复制一个对象,会调用构造函数)

一个存在继承关系的类: 对象的浅copy 代码实现如下

1, 定义两个javabean

  1. public class Per {
  2. //属性
  3. private int age;
  4. private String name;
  5. //构造
  6. public Per(int age, String name) {
  7. this.age = age;
  8. this.name = name;
  9. }
  10. public Per() {
  11. System.out.println("per 无参构造");
  12. }
  13. //get,set
  14. public int getAge() { return age; }
  15. public void setAge(int age) { this.age = age; }
  16. public String getName() { return name; }
  17. public void setName(String name) { this.name = name; }
  18. }
  19. public class Student extends Per{
  20. private int score;
  21. public int getScore(){return score;}
  22. public void setScore(int score){this.score=score;}
  23. }

2, 创建对象1, 复制为对象2—————-反射:(构造+ 字段 ), ( 构造 + set/get ),(构造+ get)

  1. //创建对象: 有属性
  2. Student st = new Student();
  3. @before
  4. public void init(){
  5. st.setName("yyyy");
  6. st.setAge(23);
  7. st.setScore(99)
  8. }
  9. /**
  10. * 反射: 通过属性---copy对象
  11. * @throws Exception
  12. */
  13. @Test
  14. public void t1() throws Exception {
  15. //创建对象: 带参构造
  16. Class<?> clazz = Class.forName("Student");
  17. Constructor<?> cons = clazz.getDeclaredConstructor(int.class);
  18. Student student = (Student) cons.newInstance(80);
  19. //获取: 父类属性--------------------------
  20. Class<?> sup = clazz.getSuperclass();
  21. Field age = sup.getDeclaredField("age");
  22. age.setAccessible(true);
  23. Field name = sup.getDeclaredField("name");
  24. name.setAccessible(true);
  25. //赋值
  26. age.set(student,st.getAge());
  27. name.set(student,st.getName());
  28. System.out.println(student.getName() + "," + student.getAge()+","+student.getScore());
  29. }
  30. /**
  31. * 反射: 通过方法----copy对象
  32. * @throws Exception
  33. */
  34. @Test
  35. public void t2() throws Exception {
  36. //创建对象: 带参构造
  37. Class<?> clazz = Class.forName("Student");
  38. Constructor<?> cons = clazz.getDeclaredConstructor(int.class);
  39. Student student = (Student) cons.newInstance(89);
  40. //获取: 父类方法
  41. Method setAge = clazz.getMethod("setAge", int.class);
  42. Method setName = clazz.getMethod("setName", String.class);
  43. //赋值
  44. setAge.invoke(student, st.getAge());
  45. setName.invoke(student, st.getName());
  46. System.out.println(student.getName() + "," + student.getAge()+","+student.getScore());
  47. }
  48. @Test
  49. public void t3() throws Exception {
  50. /**
  51. * get--->set方法名, 参数
  52. */
  53. //创建对象
  54. Class<?> clazz = Class.forName("Student");
  55. Student st2 = (Student) = clazz.newInstance();
  56. //get方法---》set赋值
  57. Class clazz = st.getClass();
  58. Method[] ms = clazz.getMethods();
  59. //判断: 是否getAge()
  60. for (Method m : ms) {
  61. String get = m.getName();
  62. Class<?>[] paramType = m.getParameterTypes();
  63. Class<?> retType = m.getReturnType();
  64. if (get.startsWith("get") && paramType.length == 0 && retType != Class.class) {
  65. Object returnVal = m.invoke(st);
  66. String set = get.replace("get", "set");
  67. //set : 参数---->第二个Obj赋值
  68. Method setMetho = clazz.getMethod(set, retType);
  69. setMetho.invoke(st2, returnVal);
  70. }
  71. }
  72. System.out.println(st2.getName() + "," + st2.getAge() );
  73. }

part3: 内省机制—-对象copy

  1. @Test
  2. public void t4() throws Exception {
  3. Student st = new Student();
  4. st.setAge(40);
  5. st.setName("aaaa");
  6. st.setScore(99);
  7. Student st2 = new Student();
  8. /**
  9. * 内省: 实现---2个对象: 属性拷贝
  10. */
  11. BeanInfo binfo = Introspector.getBeanInfo(st.getClass());
  12. PropertyDescriptor[] propDes = binfo.getPropertyDescriptors();
  13. for (PropertyDescriptor proDescriptor : propDes) {
  14. Method read = proDescriptor.getReadMethod();
  15. Method write = proDescriptor.getWriteMethod();
  16. String fieldName = proDescriptor.getName();
  17. if (read != null && write != null) {
  18. if (!fieldName.equals("class"))
  19. write.invoke(st2, read.invoke(st));
  20. }
  21. }
  22. System.out.println(st2.getName() + "," + st2.getAge()+ ","+st2.getScore());
  23. }

part4: 对象的深度copy

( 不会调用构造方法, 父类和子类: 都要 implements Serializable)

  1. @Test
  2. public void t5() throws IOException, ClassNotFoundException {
  3. Student st = new Student();
  4. st.setAge(40);
  5. st.setName("aaaa");
  6. //把各个属性: 组合为byte[]
  7. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  8. ObjectOutputStream objout = new ObjectOutputStream(baos);
  9. objout.writeObject(st);
  10. baos.close();
  11. objout.close();
  12. ObjectInputStream objin = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()));
  13. Student student= (Student) objin.readObject();
  14. objin.close();
  15. System.out.println(student.getName() + "," + student.getAge()+","+student.getScore());
  16. }

发表评论

表情:
评论列表 (有 0 条评论,344人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java 内省机制

    一、内省机制概述         Java中的反射机制是通过名称得到类的方法和对象的成份,对于一切Java类都是适用的,但是有时候使用起来比较麻烦。而JavaBean...

    相关 Java反射内省

    反射 用一句比较白的话来概括,反射就是让你可以通过名称来得到对象(类,属性,方法)的技术。 例如我们可以通过类名来生成一个类的实例;知道了方法名,就可以调用这个方法;知道了

    相关 Java反射机制

    百科: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法

    相关 java 内省机制

    什么是内省: 官方: 内省(Introspector)是Java语言对Bean类属性、事件的一种缺省处理方法。 个人理解: 说白了就是通过反

    相关 Java内省机制

    1).内省(Introspector)是Java 语言对Bean类属性、事件的一种缺省处理方法。例如类 A 中有属性 name, 那我们可以通过 getName,setN...