zoukankan      html  css  js  c++  java
  • 反射中的 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

  • 相关阅读:
    sed点滴
    JS中使用window.open("url?param="+paramvalue)传递参数出现乱码
    java算法之插入排序法
    NodeJS中的事件模块EventEmitter
    转载: 通过Object.prototype.toString 精确判断对象的类型
    CommonJS的模块规范
    Windows Store App之文件选择器、文件保存器和文件夹选择器
    vue日期格式化
    Linux下安装Apache
    ubuntu 安装 ES 以及集群的搭建
  • 原文地址:https://www.cnblogs.com/libin6505/p/11226532.html
Copyright © 2011-2022 走看看