转:

class反射(一),以及Method 的 getReadMethod 与 getWriteMethod 使用

2018年11月28日 17:27:42 zich77521 阅读数 788
 

class

Java在识别类信息与加载它时,通常有两种方式来对类信息进行操作:

  1. RTTI,类在编译时期就已经知道类的信息,我们调用时直接进行了new 对象;
  2. 反射机制,这一种是在程序运行时进行了类加载,而前提是我们在编译时期没有进行加载

每一个类都会对应存在的class对象,也就是存在于.class文件,在我们的一次使用的时候,jvm就回调用它;

而static初始化,会在类加载时进行

我们在进行引用时,类加载器首先会检查一下这个class对象是否被加载过,如果没有被加载,就回根据这个类名进行查找相对应的class文件,加载文件,然后进行对其方法的引用。

我们在进行获取引用时,我们可以进行使用Class.forName("),进行对这个类的加载,也可以用(类名).class对这个类进行加载,但是(类名),class不会进行对这个对象进行初始化

加载一般分为三个步骤进行:

  1. 加载,类加载器进行加载此此对象,找到对应的字节码,创建一个class对象
  2. 链接:验证字节码文件,并且对静态域创造空间
  3. 初始化:检查是否有超类,如果有就对其进行加载,并且对其执行静态初始化域,跟静态初始化块。
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

建议同志们看一下原文章,原文章内容比较充实

另外附一篇博客,https://www.cnblogs.com/rocomp/p/4781987.html

反射中的 Method 的 getReadMethod 与 getWriteMethod 使用 【获取一个对象的所有属性字段名称和其对应的值】的更多相关文章

  1. Sql中获取表结构(字段名称,类型,长度,说明)

    Sql中获取表结构(字段名称,类型,长度,说明) SELECT TableName = OBJECT_NAME(c.object_id), ColumnsName = c.name, Descript ...

  2. Go - 反射中 函数 和 方法 的调用 - v.Call()

    上一篇文章 说到了 Golang 中的反射的一些基本规则,重点就是文章中最后的三点,但是这篇文章并没有说如何在反射中调用函数和方法,这就是接下来要说的. 反射中调用 函数 众所周知,Golang 中的 ...

  3. golang 反射中调用方法

    反射中调用函数 众所周知,golang中的函数是可以像普通的int.float等类型变量那样作为值的,例如: package main import "fmt" func hell ...

  4. java反射field和method的顺序问题

    最近在有思考到序列化性能优化的问题,关于java反射field和method的顺序问题,这里有详细的讨论http://stackoverflow.com/questions/5001172/java- ...

  5. struts2.Action中的method属性配置

    .Action中的method属性 在struts1.x中我们知道通过继承DispatchAction可以实现把多个Action进行统一操作,在struts2中实现action的统一操作也很简单.我们 ...

  6. Struts2 | struts.xml文件中使用method属性和通配符简化action标签和Action处理类的编写

    转自:https://www.jianshu.com/p/310e89ee762d 在Struts2框架中,我们知道基本的Action标签只能实现一个url请求对应一个Action处理类.那么我们如果 ...

  7. Java循环一个对象的所有属性,并通过反射给这些属性赋值/取值

    Java循环一个对象的所有属性,并通过反射给这些属性赋值/取值 说到循环遍历,最常见的遍历数组/列表.Map等.但是,在开发过程中,有时需要循环遍历一个对象的所有属性.遍历对象的属性该如何遍历呢?查了 ...

  8. java实体类和json串字段名称不一致或者与map中字段名称不一致使用注解转化

    package yuanCheng; import java.text.MessageFormat; import java.util.ArrayList; import java.util.List ...

  9. SQL查询数据库中所有指定类型的字段名称和所在的表名

    --查询数据库中所有指定类型的字段名称和所在的表名 --eg: 下面查的是当前数据库中 所有字段类型为 nvarchar(max) 的字段名和表名 SELECT cols.object_id , co ...

随机推荐

  1. linux usb驱动记录(二)

    三.usb设备的识别过程 在这里梳理一下上一篇博客中的内容:(这张图来自https://blog.csdn.net/lizuobin2/article/details/51931161) 上一篇博客刚 ...

  2. ConcurrentDictionary源码概读

    ConcurrentDictionary的数据结构主要由Tables和Node组成,其中Tables包括桶(Node,节点)数组.局部锁(Local lock).每个锁保护的元素数量(PerLock) ...

  3. Matlab---绘图及其位置摆放

    Matlab---绘图及其位置摆放 [@WP@20180509] 一.绘图函数 (1)绘制二维图形 (1.1) plot( ) 函数的应用格式. 1,plot(x). 当x 为一向量时,以x 元素的值 ...

  4. iview 表单验证不通过问题?

    项目需要,需要怂iview..使用一段时间感觉跟elementUI用起来差不多很方便.使用过程中遇到表单验证问题,如何避免在验证过程中偶尔出现验证不通过的异常情况? <1>:给 <F ...

  5. MySQL No Install zip安装方法

    解压 解压安装包到一个目录,比如:D:\Database\mysql-5.1.55 配置 创建配置文件 创建一个my.ini文件,MYSQL目录下有几个my开头的ini文件,是针对不同配置使用,具体可 ...

  6. BZOJ3073 [Pa2011]Journeys[最短路—线段树优化建边]

    新技能get✔. 线段树优化建边主要是针对一类连续区间和连续区间之间建边的题,建边非常的优秀.. 这题中,每次要求$[l1,r1]$每一点向$[l2,r2]$每一点建无向边,然后单元最短路. 暴力建边 ...

  7. css3 制作圆环进度条

    引子 移动端做一个 loadiing 加载的图标,跟以往沿用的都不太一样,是一个圆环进度条,圆环进度条也就罢了,还得能用百分比控制. CSS3 实现圆环 demo 刚开始写这个圆环的时候是参照帖子上给 ...

  8. django缓存--缓存加数据库型

    4.缓存+数据库Session 数据库用于做持久化,缓存用于提高效率   a. 配置 settings.py       SESSION_ENGINE = 'django.contrib.sessio ...

  9. Codeforces Round #589 (Div. 2) A. Distinct Digits

    链接: https://codeforces.com/contest/1228/problem/A 题意: You have two integers l and r. Find an integer ...

  10. RecursiveTask和RecursiveAction的使用 以及java 8 并行流和顺序流(转)

    什么是Fork/Join框架        Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架. 我 ...