欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-09 21:50:44
...

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

相关标签: 反射