反射中的 Method 的 getReadMethod 与 getWriteMethod 使用 【获取一个对象的所有属性字段名称和其对应的值】
转:
class反射(一),以及Method 的 getReadMethod 与 getWriteMethod 使用
class
Java在识别类信息与加载它时,通常有两种方式来对类信息进行操作:
- RTTI,类在编译时期就已经知道类的信息,我们调用时直接进行了new 对象;
- 反射机制,这一种是在程序运行时进行了类加载,而前提是我们在编译时期没有进行加载
每一个类都会对应存在的class对象,也就是存在于.class文件,在我们的一次使用的时候,jvm就回调用它;
而static初始化,会在类加载时进行
我们在进行引用时,类加载器首先会检查一下这个class对象是否被加载过,如果没有被加载,就回根据这个类名进行查找相对应的class文件,加载文件,然后进行对其方法的引用。
我们在进行获取引用时,我们可以进行使用Class.forName("),进行对这个类的加载,也可以用(类名).class对这个类进行加载,但是(类名),class不会进行对这个对象进行初始化
加载一般分为三个步骤进行:
- 加载,类加载器进行加载此此对象,找到对应的字节码,创建一个class对象
- 链接:验证字节码文件,并且对静态域创造空间
- 初始化:检查是否有超类,如果有就对其进行加载,并且对其执行静态初始化域,跟静态初始化块。
class MyBean{ static{
syso(“进行mybean的static加载!”);
} } public class Main { public static void main (String[] args){ syso(".class加载");
Class clazz1=MyBean.class();
syso("class.forname 加载");
Class clazz2=Class.forName("MyBean"); //类型转化前的检验很重要一般使用instanceof进行判断 }
Method 的 getReadMethod 与 getWriteMethod 的使用
【获取一个对象的所有属性字段名称和其对应的值】
package Java; import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; class TextMain2 implements Serializable {
private String name;
private String age;
public TextMain2() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public TextMain2(String name , String age){
this.name=name;
this.age=age;
}
} public class TextMain{
public static void main(String[] args) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
TextMain2 tm= new TextMain2("zhanghao" ,"1");//对其进行初始化
Class clazz=tm.getClass();
Field[] fields=clazz.getDeclaredFields();//获取其声明的字段
for (Field field:fields) {
String key = field.getName();//System.out.println(key); //输出name // age
//创建一个属性描述器
PropertyDescriptor descriptor = new PropertyDescriptor(key,clazz); //给一个属性,获取值
Method method = descriptor.getReadMethod(); //相当于为上面声明的字段设置get方法
Method method2= descriptor.getWriteMethod(); //为上面声明的字段设置set方法(又称内省)
Object ob= method.invoke(tm);
System.out.println( key +":"+ ob);
method2.invoke(tm,new String[]{"123456789"});
}
System.out.println( tm.getName());
/*输出结果:
name:zhanghao
age:1
123456789*/ }
}
原文章:https://www.cnblogs.com/luoxn28/p/5686794.html
建议同志们看一下原文章,原文章内容比较充实
反射中的 Method 的 getReadMethod 与 getWriteMethod 使用 【获取一个对象的所有属性字段名称和其对应的值】的更多相关文章
- Sql中获取表结构(字段名称,类型,长度,说明)
Sql中获取表结构(字段名称,类型,长度,说明) SELECT TableName = OBJECT_NAME(c.object_id), ColumnsName = c.name, Descript ...
- Go - 反射中 函数 和 方法 的调用 - v.Call()
上一篇文章 说到了 Golang 中的反射的一些基本规则,重点就是文章中最后的三点,但是这篇文章并没有说如何在反射中调用函数和方法,这就是接下来要说的. 反射中调用 函数 众所周知,Golang 中的 ...
- golang 反射中调用方法
反射中调用函数 众所周知,golang中的函数是可以像普通的int.float等类型变量那样作为值的,例如: package main import "fmt" func hell ...
- java反射field和method的顺序问题
最近在有思考到序列化性能优化的问题,关于java反射field和method的顺序问题,这里有详细的讨论http://stackoverflow.com/questions/5001172/java- ...
- struts2.Action中的method属性配置
.Action中的method属性 在struts1.x中我们知道通过继承DispatchAction可以实现把多个Action进行统一操作,在struts2中实现action的统一操作也很简单.我们 ...
- Struts2 | struts.xml文件中使用method属性和通配符简化action标签和Action处理类的编写
转自:https://www.jianshu.com/p/310e89ee762d 在Struts2框架中,我们知道基本的Action标签只能实现一个url请求对应一个Action处理类.那么我们如果 ...
- Java循环一个对象的所有属性,并通过反射给这些属性赋值/取值
Java循环一个对象的所有属性,并通过反射给这些属性赋值/取值 说到循环遍历,最常见的遍历数组/列表.Map等.但是,在开发过程中,有时需要循环遍历一个对象的所有属性.遍历对象的属性该如何遍历呢?查了 ...
- java实体类和json串字段名称不一致或者与map中字段名称不一致使用注解转化
package yuanCheng; import java.text.MessageFormat; import java.util.ArrayList; import java.util.List ...
- SQL查询数据库中所有指定类型的字段名称和所在的表名
--查询数据库中所有指定类型的字段名称和所在的表名 --eg: 下面查的是当前数据库中 所有字段类型为 nvarchar(max) 的字段名和表名 SELECT cols.object_id , co ...
随机推荐
- STM32L1xx——sx1278开发之LoRa扩频技术基础知识
扩频技术的发现 1944年,好莱坞26岁女影星HedyLamarr(号称世界上最美丽的女人)发明了扩频通信技术,这种跳频技术可以有效地抗击干扰和实现加密. 后来人们发现,扩频技术可以得到如下收益:从各 ...
- 前端基础(五):jQuery
jQuery介绍 jQuery是一个轻量级的.兼容多浏览器的JavaScript库. jQuery使用户能够更方便地处理HTML Document.Events.实现动画效果.方便地进行Ajax交互, ...
- CAFFE(FAQ.1):Ubuntu 配置caffe 框架之数据库读取错误:ImportError: No module named lmdb解决办法
Z: 在安装了caffe框架后需要读取大量的数据进行学习训练.比如在MNIST识别训练中,一般直接读图片会比较耗时,我们一般将图片转存为数据库中.目前主流的数据库有以下两种选择: LevelDB Lm ...
- 利用commands模块执行shell命令
利用commands模块执行shell命令 用Python写运维脚本时,经常需要执行linux shell的命令,Python中的commands模块专门用于调用Linux shell命令,并返回状态 ...
- Selenium&Appium四种等待方式
一.摘要 本博文主要介绍自动化测试中,无论是selenium或是Appium的四种等待方式,合理的使用等待对代码的稳定性,测试效率都有很大的提高 隐式等待:是在尝试发现某个元素的时候,如果没能立刻发现 ...
- mysql大数据解决方案--分表分库(0)
引言 对于一个大型的互联网应用,海量数据的存储和访问成为了系统设计的瓶颈问题,对于系统的稳定性和扩展性造成了极大的问题.通过数据切分来提高网站性能,横向扩展数据层已经成为架构研发人员首选的方式. •水 ...
- FFmpeg常用命令学习笔记(二)录制命令
录制命令 1.FFmpeg录屏命令 ffmpeg -f avfoundation -i 1 -r 30 out.yuv -f:指定使用avfoundation采集数据 -i:指定从哪采集数据,它是一个 ...
- redis主从+哨兵 安装配置二
实验环境: 192.168.2.201 centos7 master sentinel 192.168.2.202 centos7 slave sentinel 192.168.2.203 cen ...
- 【转】认证 (authentication) 和授权 (authorization) 的区别
以前一直分不清 authentication 和 authorization,其实很简单,举个例子来说: 你要登机,你需要出示你的身份证和机票,身份证是为了证明你张三确实是你张三,这就是 authen ...
- Django+MySQLDB配置
Django+MySQLDB配置 来源: ChinaUnix博客 日期: 2009.07.09 16:25 (共有条评论) 我要评论 一.安装Mysql(1)下 ...