内省(个人笔记)

什么内省?

    个人认为内省和反射有密不可分的关系,当你拿到某个类的时候,却不知道该类具体有什么的时候,可以通过内省来获取该属性。

     Student类:

     

 1 package javaBean;
 2
 3 public class Student {
 4     //创建字段
 5     private String name ="张子健" ;
 6     private int age;
 7
 8
 9     public String getName() {
10         return name;
11     }
12     public void setName(String name) {
13         this.name = name;
14     }
15     public int getAge() {
16         return age;
17     }
18     public void setAge(int age) {
19         this.age = age;
20     }
21     public String Aderss() {
22         return "address";
23     }
24     @Override
25     public String toString() {
26         return "Student [name=" + name + ", age=" + age + "]";
27     }
28
29
30 }

Student

       测试类:

 1 package javaBean;
 2
 3 import java.beans.BeanInfo;
 4 import java.beans.Introspector;
 5 import java.beans.PropertyDescriptor;
 6 import java.lang.reflect.Method;
 7 import java.util.HashMap;
 8 import java.util.Map;
 9
10 import org.apache.commons.beanutils.BeanUtils;
11 import org.junit.Test;
12
13 public class TestDemo {
14
15     @Test
16     public void test() throws Exception{
17         //获取Student的所有属性描述器,含父类继承下的
18         BeanInfo info = Introspector.getBeanInfo(Student.class);
19         //获取Student的所有属性描述器
20         PropertyDescriptor[] pdi = info.getPropertyDescriptors();
21         //for
22         System.out.println(pdi.length);
23         for(PropertyDescriptor pd :pdi){
24             System.out.println(pd.getName());
25         }
26
27     }
28
29     @Test
30     public void test2() throws Exception{
31         //获取Student的所有属性描述器,不含父类继承下的
32         BeanInfo info = Introspector.getBeanInfo(Student.class,Object.class);
33         //获取Student的所有属性描述器
34         PropertyDescriptor[] pdi = info.getPropertyDescriptors();
35         //for
36         System.out.println(pdi.length);
37         for(PropertyDescriptor pd :pdi){
38             System.out.println(pd.getName());
39         }
40
41     }
42     @Test
43     public void test3() throws Exception{
44         //获取属性并进行修改
45         PropertyDescriptor descriptor = new PropertyDescriptor("name", Student.class);
46         Method method = descriptor.getReadMethod();//获得了Student的getName()
47         Student s =new Student();
48
49         String value = (String)method.invoke(s, null);
50         System.out.println(value);
51         //设置属性
52         Method method2 = descriptor.getWriteMethod();
53
54         method2.invoke(s, "陈帅帅");
55         System.out.println(s.getName());
56
57
58     }
59     //内省的方式,前提是需要导包
60     @Test
61     public void test4() throws Exception{
62         //首先创建对象
63         Student s =new Student();
64         //内省的方式
65         String bean = BeanUtils.getProperty(s, "name");
66         System.out.println(bean);
67         //修改属性
68         BeanUtils.setProperty(s, "name", "李超");
69         System.out.println(s.getName());
70     }
71     //反射和内省的实际效果,假设Student 什么也不知道
72     @Test
73     public void test5() throws Exception{
74         //我们要了解其中有什么,不包含其父亲属性?获取其所有的属性
75          BeanInfo beanInfo = Introspector.getBeanInfo(Student.class,Object.class);
76          //获取其所有的属性数组
77          PropertyDescriptor[] des = beanInfo.getPropertyDescriptors();
78          //查看其个数
79          System.out.println(des.length);
80          for(PropertyDescriptor p :des){
81              System.out.println(p.getName());
82          }
83          //好,现在加入给你一个Map集合,要你吧集合中的值添加到Student中去,该怎么做?
84          Map<String ,Object>  map =new HashMap<String ,Object>();
85          map.put("key1", "张三");
86          map.put("key1", 13);
87          Student s = new Student();
88          //利用内省 炒鸡简单
89          BeanUtils.populate(s, map);
90          System.out.println(s);
91
92     }
93 }

TestDemo

    当使用JavaBean时候需要导包:

    

时间: 2024-11-09 17:46:27

内省(个人笔记)的相关文章

【DAY24】内省,NIO的学习笔记

java.lang.Class java.lang.reflect.Field java.lang.reflect.Method java.lang.reflect.Constructor //static代码块 Class.forName("",boolean , ClassLoader); JVM结构 ---------------- Ru.ntime Data Area 1.Method Area //方法区. 共享 2.Heap //存放对象和数组.共享 //Data acce

【Java笔记】Java——远程监控、反射、代理、内省机制

远程控制的基本原理 远程控制(RemoteControl)拥有控制端和被控端双方. 控制方通过请求,取得对远端的操作,实现远端的事件回放功能,同时,应该看得到远端桌面的画面.而被控方必须在建立ServerSocket之后进行对外来请求的鉴听. 1 /** 2 * 客户端发送事件 3 * @param e 4 */ 5 public void sendEvent(InputEvent e){ 6 try { 7 SinglClient.getInstance().getOos().writeObj

Java读书笔记十一(Java中的内省机制)

1.前言 最近在学习Java的时候,突然发现了这个概念,鉴于好奇心的压迫,于是打算写一篇博客来总结一下. 2.什么是内省机制 为了让程序员们更好的从左Java对象的属性,SUN公司开发了一套API,就被我们称为"内省",有利于我们对类对象的属性的操作,减少了代码的数量. 3.内省和反射有什么区别 反射式在运行状态把Java类中的各种成分映射成相应的Java类,可以动态的获取所有的属性以及动态调用任意一个方法,强调的是运行状态. 内省机制是通过反射来实现的,BeanInfo用来暴露一个b

Java系列笔记(2) - Java RTTI和反射机制

目录 前言 传统的RTTI 反射 反射的实现方式 反射的性能 反射与设计模式 前言 并不是所有的Class都能在编译时明确,因此在某些情况下需要在运行时再发现和确定类型信息(比如:基于构建编程,),这就是RTTI(Runtime Type Information,运行时类型信息). 在java中,有两种RTTI的方式,一种是传统的,即假设在编译时已经知道了所有的类型:还有一种,是利用反射机制,在运行时再尝试确定类型信息. 本文主要讲反射方式实现的RTTI,建议在阅读本文之前,先了解类的加载机制(

Foundation 学习笔记

笔记内容 学习笔记-段玉磊 Stanford course Foundation and Attributed Strings Dynamic binding id 是一个指向任何未知对象的指针,(the consept of dynamic binding) 静态类型化:id 不会发生警告 而NSString *s 会发生警告! Nerver use iD ,因为id只是指针,很危险!! 强制转换需要保护! id保护机制 Introspection 内省机制 ,也就是说通过指定id是什么类型

Java笔记(9)

JSP 存在两种 开发模式 Model1 : JSP + JavaBean * 不适合开发业务逻辑特别复杂web应用 ----- 业务逻辑复杂,控制代码多,而在jsp中编写控制代码,十分不便 Model2 : JSP + JavaBean + Servlet 符合MVC设计模式 JSP(View视图功能):负责页面显示 JavaBean(Model 模型功能):负责数据封装和处理 Servlet(Controller 控制器功能):连接模型和视图,对整个业务流程进行控制,调用JavaBean封装

Java笔记(10)

第一天 ----- 第十天 知识点复习 day1 XML 语法和两种约束技术 1.XML语法写法.规范: 根元素必须唯一.元素名称与属性名称不能以数字开始.元素标记必须结束.元素不能交叉嵌套.属性值必须加引号(双引号.单引号) ----- 考试:排错 2.CDATA块 与 特殊字符转义在 使用上区别 ? <book> <p>标记的作用 </book>  ----- 标记内容 <p> 是一个特殊内容 CDATA : <book> <![CDA

《程序员的呐喊》读书笔记(下)

接着<程序员的呐喊>读书笔记(上),继续分享下篇,这次干货比较多哦,有静动态类型的优缺点.强弱类型系统的对抗.设计模式.程序员的数学.编译器的重要性以及保守派自由派的较量,一时消化不了的建议保存以便read it later. 静态类型和动态类型的优缺点 静态类型的优点下面列出了静态类型的主要优点:(1)静态类型可以在程序运行之前,依赖其与生俱来的限制来及早发现一些类型错误.(或是在插入/更新记录,解析XML文档等情况下进行检测.)(2)静态类型有更多机会(或者说更容易)优化性能.例如只要数据

Effective Go(官方文档)笔记

Effective Go(官方文档)笔记 自己主动局部变量提升(编译期完毕?):return &...; 内置函数: new/make copy, append delete range(这是keyword吧?由于后面没有()) array是值对象 slice:引用array 2维切片(略) map if seconds, ok := timezone[tz]; ok { ... func (f *File) Read(buf []byte) (n int, err error) { ... 注