java学习之内省

反射加内省解决耦合问题

 1 package com.gh.introspector;
 2 /**
 3  * JavaBean
 4  * @author ganhang
 5  *
 6  */
 7 public class Dog {
 8     private String name;
 9     private int age;
10     public String getName() {
11
12         return name;
13     }
14     public void setName(String name) {
15         this.name = name;
16     }
17     public int getAge() {
18         return age;
19     }
20     public void setAge(int age) {
21         this.age = age;
22     }
23     @Override
24     public String toString() {
25         return "Dog [name=" + name + ", age=" + age + "]";
26     }
27
28 }
 1 package com.gh.introspector;
 2
 3 import java.beans.BeanInfo;
 4 import java.beans.Introspector;
 5 import java.beans.PropertyDescriptor;
 6 import java.io.IOException;
 7 import java.io.InputStream;
 8 import java.lang.reflect.Method;
 9 import java.util.Properties;
10
11 /**
12  * 工厂类
13  * @author ganhang
14  *
15  */
16 public class DogFactory {
17     //属性文件操作工具类
18     private static Properties config = new Properties();
19     static {
20         // 读取属性文件到输入流
21         InputStream is = Thread.currentThread()
22                 .getContextClassLoader().getResourceAsStream("bean.properties");
23         //注意:配置文件放src下可以不用写包名,如果放包里面则要写包名,否者下面报空指针
24         try {
25             // 加载输入流
26             config.load(is);
27             is.close();
28         } catch (IOException e) {
29             e.printStackTrace();
30         }
31     }
32     // 同样不想与Dog耦合,直接依赖,所以用配置文件创建dog
33     public static Dog getDog(String name) {
34
35         // 根据key获取values
36         String classname = config.getProperty(name);
37         try {
38             // 根据类全名获取类信息Class对象
39             Class dogClass = Class.forName(classname);
40             // 实例化对象
41             Dog dog = (Dog) dogClass.newInstance();
42             // 内省:获取bean信息
43             BeanInfo beanInfo = Introspector.getBeanInfo(dogClass);
44             // 通过bean信息获得所有属性描述器(数组)
45             PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
46             // 循环遍历属性描述器
47             for (PropertyDescriptor pd : pds) {
48                 if ("name".equals(pd.getName())) {
49                     String nameValue = config.getProperty("dog.name");
50                     // 通过属性描述器获得改属性上的写操作方法(set方法)
51                     Method method = pd.getWriteMethod();
52                     // 在dog对象上调用方法
53                     method.invoke(dog, nameValue);
54                 } else if ("age".equals(pd.getName())) {
55                     String ageValue = config.getProperty("dog.age");
56                     // 通过属性描述器获得改属性上的写操作方法(set方法)
57                     Method method = pd.getWriteMethod();
58                     // 在dog对象上调用方法,注意String转int
59                     method.invoke(dog, Integer.parseInt(ageValue));
60                 }
61             }
62             return dog;
63         } catch (Exception e) {
64             e.printStackTrace();
65         }
66         return null;
67     }
68 }

配置文件bean.properties

#\u914D\u7F6EJavaBean\u7684\u5168\u540D
dog=com.gh.introspector.Dog
dog.name=\u5C0F\u767D
dog.age=3

时间: 2024-10-13 02:07:51

java学习之内省的相关文章

好程序员Java学习路线Java bean是个什么概念

好程序员Java学习路线Java bean是个什么概念,Bean的中文含义是"豆子",顾名思义JavaBean是一段Java小程序.JavaBean实际上是指一种特殊的Java类,它通常用来实现一些比较常用的简单功能,并可以很容易的被重用或者是插入其他应用程序中去.所有遵循一定编程原则的Java类都可以被称作JavaBean.一. Java Bean技术概述??????? Java Bean是基于Java的组件模型,由属性.方法和事件3部分组成.在该模型中,JavaBean可以被修改或

2016最新Java学习计划

一.Java学习路线图 二.Java学习路线图--视频篇 六大阶段 学完后目标 知识点 配套免费资源(视频+笔 记+源码+模板) 密码        第一阶段 Java基础 入门 学习周期: 35天 学完后目标: 1.可进行小型应用程序开发 2.对数据库进行基本的增删改查管理 市场价值:¥5000 计算机基础知识 计算机基础.DOS常用命令.Java概述.JDK环境安装配置.环境变量配置.Java程序入门 1.2015年Java基础视频-深入浅出精华版(强烈推荐) 2.历经5年锤炼(适合初学者入

Java学习第5天

---恢复内容开始--- 今天是2016年5月4号,今天是学习JAVA学习的第5天!今天的主要学习任务是对二维数组的学习. P96 3.7.5 二维数组 动态初始化 数据类型 数组名称 [][]=new 数据类型[行数][列数]   ; 如,int a[][]=new int[7][8]; 静态初始化 数据类型 数组名称 [][]=new 数据类型 [][]{ {值,值,...},{值,值,...},...}; 如,int a[][]=new int[][]{ {1,2,3},{54,6},{8

Java学习-008-判断文件类型实例

此文源码主要为应用 Java 如何判断文件类型的源码及其测试源码.若有不足之处,敬请大神指正,不胜感激!源代码测试通过日期为:2015-2-2 23:02:00,请知悉. Java 判断文件类型源码如下所示: 1 /** 2 * @function 判断文件类型 3 * 4 * @author Aaron.ffp 5 * @version V1.0.0: autoUISelenium main.java.aaron.java.tools FileUtils.java assertFileType

疯狂JAVA学习计划

? Java_StudyPlane ?2015/2/20 ????????大年初二 ????????雨天 1.5小时为1个课时. JAVA学习进度表

java学习教程之代码块

学编程吧java学习教程之代码块发布了,欢迎通过xuebiancheng8.com来访问 java中的代码块包括下面几种: 1.普通代码块 2.构造代码块 3.静态代码块 1.普通代码块很简单看下面这个例子: public class Test{ public static void main(String args[]){ { //此处就是普通代码块,普通代码块中的代码按顺序执行 System.out.println("hello"); } } } 2.构造代码块 public cl

Java学习作业(14.4.21)

前三次作业都是基础语法.真的好水啊.从这次开始记录. 1.编写Java程序,把当前目录下扩展名为txt的文件的扩展名全部更名为back. 1 import java.io.*; 2 import java.lang.*; 3 4 5 public class Home { 6 7 public void reName(String path, String from, String to) { 8 File f = new File(path); //声明File对象,用于导入修改路径 9 Fi

【分享】不知道怎么学java?java学习路线送上!让你不再迷茫!

学习Java之前,先别急,静下心来好好想想:1)你对学习Java是否有兴趣?2)你是否能静下心来坚持不懈地学习?嗯,这是个容易但又绝对不应该忽略的问题,你确信自己对Java感兴趣.而且又有吃苦的准备,那你才可能学好Java!如果具备这两点条件,就请继续往下看(帖子后面我会分享一些java学习教程)Java体系涉及到三个方面:J2SE,J2EE,J2ME(KJAVA).(1)J2SE--Java 2 Platform Standard Edition,即JDK,它是三者的基础,属于桌面级应用开发:

Java 学习路线建议

在大家看之前,我要先声明两点.1.由于我本人是Java后端开发出身,因此所推荐的学习内容是Java Web和Java后端开发的路线,非Java Web和Java后端开发的同学请适当参考其学习思想即可,切勿照搬.2.下面对于[第一部分]的推荐内容,目的是让你尽快成为一个可以参加工作的Java开发者,更适用于处于待业状态,准备转行Java的同学. 如果你是在校学生,务必要在学好基础(比如计算机系统.算法.编译原理等等)的前提下,再考虑去进行下面的学习.第一部分:对于尚未做过Java工作的同学,包括一