1 public class Demo02 {
2 @SuppressWarnings("all")
3 public static void main(String[] args) throws Exception {
4 // 另一个com.sg.myReflection.bean包下的User类
5 String path = "com.sg.myReflection.bean.User";
6 try {
7 Class clazz = Class.forName(path);
8         // User.class new User().getClass()
9 // 获取类名
10 String strName01 = clazz.getName();// 获取完整类名com.sg.myReflection.bean.User
11 String strName02 = clazz.getSimpleName();// 直接获取类名 User
12
13 // 获取属性
14 Field[] field01 = clazz.getFields(); // 返回属性为public的字段
15 Field[] field02 = clazz.getDeclaredFields(); // 返回所有的属性
16 Field field03 = clazz.getDeclaredField("id"); // 获取属性为id的字段
17
18 // 获取普通方法
19 Method[] Method01 = clazz.getDeclaredMethods(); // 返回public方法
20 Method method = clazz.getDeclaredMethod("getId", null); // 返回getId这个方法,如果没有参数,就默认为null
21
22
23 // 获取构造方法
24 User u1 = (User) clazz.newInstance(); // 获取无参的构造函数这里的前提的保证类中应该有无参的构造函数
25 // 获取参数为(int,String,int)的构造函数
26 Constructor c2 = clazz.getDeclaredConstructor(int.class, String.class, int.class);
27 // 通过有参构造函数创建对象
28 User u2 = (User) c2.newInstance(1001, "小小", 18);
29
30
31 // 通过反射调用普通方法
32 User u3 = (User) clazz.newInstance();
33 Method method03 = clazz.getDeclaredMethod("setId", int.class);
34 method.invoke(u3, 1002); // 把对象u3的id设置为1002
35
36
37
38 // 通过反射操作普通的属性
39 User u4 = (User) clazz.newInstance();
40 Field f = clazz.getDeclaredField("name");
41 f.setAccessible(true); // 设置属性可以直接的进行访问
42 f.set(u4, "石头");
43
44 } catch (ClassNotFoundException e) {
45 e.printStackTrace();
46 }
47 }
48 }
  1 public static void getObjectValue(Object object) throws Exception {
2 //我们项目的所有实体类都继承BaseDomain (所有实体基类:该类只是串行化一下)
3 //不需要的自己去掉即可
4 if (object != null && object instanceof BaseDomain) {//if (object!=null ) ----begin
5 // 拿到该类
6 Class<?> clz = object.getClass();
7 // 获取实体类的所有属性,返回Field数组
8 Field[] fields = clz.getDeclaredFields();
9
10 for (Field field : fields) {// --for() begin
11 System.out.println(field.getGenericType());//打印该类的所有属性类型
12
13 // 如果类型是String
14 if (field.getGenericType().toString().equals(
15 "class java.lang.String")) { // 如果type是类类型,则前面包含"class ",后面跟类名
16 // 拿到该属性的gettet方法
17 /**
18 * 这里需要说明一下:他是根据拼凑的字符来找你写的getter方法的
19 * 在Boolean值的时候是isXXX(默认使用ide生成getter的都是isXXX)
20 * 如果出现NoSuchMethod异常 就说明它找不到那个gettet方法 需要做个规范
21 */
22 Method m = (Method) object.getClass().getMethod(
23 "get" + getMethodName(field.getName()));
24
25 String val = (String) m.invoke(object);// 调用getter方法获取属性值
26 if (val != null) {
27 System.out.println("String type:" + val);
28 }
29
30 }
31
32 // 如果类型是Integer
33 if (field.getGenericType().toString().equals(
34 "class java.lang.Integer")) {
35 Method m = (Method) object.getClass().getMethod(
36 "get" + getMethodName(field.getName()));
37 Integer val = (Integer) m.invoke(object);
38 if (val != null) {
39 System.out.println("Integer type:" + val);
40 }
41
42 }
43
44 // 如果类型是Double
45 if (field.getGenericType().toString().equals(
46 "class java.lang.Double")) {
47 Method m = (Method) object.getClass().getMethod(
48 "get" + getMethodName(field.getName()));
49 Double val = (Double) m.invoke(object);
50 if (val != null) {
51 System.out.println("Double type:" + val);
52 }
53
54 }
55
56 // 如果类型是Boolean 是封装类
57 if (field.getGenericType().toString().equals(
58 "class java.lang.Boolean")) {
59 Method m = (Method) object.getClass().getMethod(
60 field.getName());
61 Boolean val = (Boolean) m.invoke(object);
62 if (val != null) {
63 System.out.println("Boolean type:" + val);
64 }
65
66 }
67
68 // 如果类型是boolean 基本数据类型不一样 这里有点说名如果定义名是 isXXX的 那就全都是isXXX的
69 // 反射找不到getter的具体名
70 if (field.getGenericType().toString().equals("boolean")) {
71 Method m = (Method) object.getClass().getMethod(
72 field.getName());
73 Boolean val = (Boolean) m.invoke(object);
74 if (val != null) {
75 System.out.println("boolean type:" + val);
76 }
77
78 }
79 // 如果类型是Date
80 if (field.getGenericType().toString().equals(
81 "class java.util.Date")) {
82 Method m = (Method) object.getClass().getMethod(
83 "get" + getMethodName(field.getName()));
84 Date val = (Date) m.invoke(object);
85 if (val != null) {
86 System.out.println("Date type:" + val);
87 }
88
89 }
90 // 如果类型是Short
91 if (field.getGenericType().toString().equals(
92 "class java.lang.Short")) {
93 Method m = (Method) object.getClass().getMethod(
94 "get" + getMethodName(field.getName()));
95 Short val = (Short) m.invoke(object);
96 if (val != null) {
97 System.out.println("Short type:" + val);
98 }
99
100 }
101 // 如果还需要其他的类型请自己做扩展
102
103 }//for() --end
104
105 }//if (object!=null ) ----end
106 }
107
108 // 把一个字符串的第一个字母大写、效率是最高的、
109 private static String getMethodName(String fildeName) throws Exception{
110 byte[] items = fildeName.getBytes();
111 items[0] = (byte) ((char) items[0] - 'a' + 'A');
112 return new String(items);
113 }

有关java之反射的使用的更多相关文章

  1. JAVA的反射理解

    1----------------------------反射的概念----------------------------------------------- JAVA的反射机制是在运行状态中,对 ...

  2. java的反射

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

  3. iOS运行时编程(Runtime Programming)和Java的反射机制对比

    运行时进行编程,类似Java的反射.运行时编程和Java反射的对比如下:   1.相同点   都可以实现的功能:获取类信息.属性设置获取.类的动态加载(NSClassFromString(@“clas ...

  4. Java 类反射机制分析

    Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...

  5. java的反射机制

    一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...

  6. Java:反射

    初识Java反射机制: 从上面的描述可以看出Java的反射机制使得Java语言可以在运行时去认识在编译时并不了解的类/对象的信息,并且能够调用相应的方法或修改属性的值.Java反射机制的核心就是允许在 ...

  7. Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别

    一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:   其中

  8. java笔记--反射进阶之总结与详解

    一.反射进阶之动态设置类的私有域 "封装"是Java的三大特性之一,为了能更好保证其封装性,我们往往需要将域设置成私有的, 然后通过提供相对应的set和get方法来操作这个域.但是 ...

  9. java笔记--反射机制之基础总结与详解

    一.反射之实例化Class类的5种方式: java的数据类型可以分为两类,即引用类型和原始类型(即基本数据类型). 对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象 ...

  10. Java中反射的三种常用方式

    Java中反射的三种常用方式 package com.xiaohao.test; public class Test{ public static void main(String[] args) t ...

随机推荐

  1. PDF如何自动滚动阅读

    PDF如何自动滚动阅读 视图---页面显示---自动滚动 快捷键 Ctrl +shift+H

  2. Android Studio加入插件(Genymotion)

    官方模拟器的龟速已让我们无力吐槽.幸好有genymotion这款逆天的Android虚拟机,它有着高速的开启速度,良好的交互界面. 是Android开发必备的良品.甚至有些玩家已经用genymotio ...

  3. 《TCP/IP具体解释卷2:实现》笔记--IP的分片和重装

    IP首部内有三个字段实现分片和重装:标识字段(ip_id).标志字段(ip_off的3个高位比特)和偏移字段(ip_off的13个低位 比特).标志字段由3个1bit标志组成.比特0是保留的必须为0, ...

  4. c#创建对象并动态添加属性

    //动态类,可以作为基类被继承 dynamic backObj = new ExpandoObject(); //ExpandoObject 为密封类 backObj.image0 = IMGNAME ...

  5. csv文件中出现乱码的解决方法

    1.首先用UE打开CSV文件,发现没有乱码了. 2.然后新建一个txt文本,把CSV中的数据复制到txt文本中,保存格式为ANSI/ASCII. 3.复制txt文件,再把副本后缀改为CSV格式,再用E ...

  6. Weka学习之关联规则分析

    步骤: (一) 选择数据源 (二)选择要分析的字段 (三)选择需要的关联规则算法 (四)点击start运行 (五) 分析结果 算法选择: Apriori算法参数含义 1.car:如果设为真,则会挖掘类 ...

  7. FP Tree算法原理总结(转载)

    FP Tree算法原理总结 在Apriori算法原理总结中,我们对Apriori算法的原理做了总结.作为一个挖掘频繁项集的算法,Apriori算法需要多次扫描数据,I/O是很大的瓶颈.为了解决这个问题 ...

  8. subject相关信息

    记录一下我的错误信息 在ssm+shiro整合的时候,发现这样一个问题,第一次登录进去之后,然后再登录,输入错误的用户名和密码,竟然仍然登录成功,突然想起来了,是不是login之后,logout之后这 ...

  9. EasyUI分页(前台分页和后台分页)

    整理一下以前的总结: 分页包括前台分页和后台分页两种,针对数据量比较小的,比如说单位,角色等,可以使用前台分页,而针对日志文件这些,需要后台分页. 先说说前台分页吧: function pagerFi ...

  10. 06 nginx Location详解之精准匹配

    一:Location详解之精准匹配 location 语法 location 有”定位”的意思, 根据Uri来进行不同的定位. 在虚拟主机的配置中,是必不可少的,location可以把网站的不同部分, ...