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

 

转:

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

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

posted @ 2019-07-22 16:14  戈博折刀  阅读(1977)  评论(0编辑  收藏  举报