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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值