java反射入门

*首先,为我偷了这么多天懒道个歉。果然,人一安逸下来,就会堕落。

今天讲一下简单的java反射。用于反射的入门

1.什么是反射?
JAVA反射机制是在运行状态中,对于任意一个类,都能都知道这个类的所有属性和方法。对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称之为java语言的反射机制;
2.反射的作用
在日常的第三方应用开发过程中,经常会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法。

图书类

@Data
//为lombok插件中的注解 为类提供getXX() setXX() equals()、hashCode()、toString()方法
public class BookInfo {
    private  Integer price;//书的价格
    private  String  name;//书名

   private BookInfo(Integer price, String name)//私有构造器
    {
        this.price=price;
        this.name=name;
        System.out.println("这是私有的构造器");
    }


    public  BookInfo(Integer price)//公有构造器
    {
      this.price=price;
    }
    public  BookInfo()//共有构造器
    {

    }

    
}

反射讲解及测试

public class test {

    @Test
    public void test1() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
        //1获取类的三种方式
        Class cls1=BookInfo.class;
       Class cls2=new BookInfo().getClass();
        Class  cls3=Class.forName("com.rd.pojo.BookInfo"); //字符串内部的组成是包+类名
        // 我们通常用的是反射的第三种方式来获取某个类
        // 例如原生态的jdbc中class.forName("com.mysql.cj.Driver");其实就是利用了反射获取Driver类的内容

        //2.获取类以后,常用来获得该类的构造器,属性,方法。下面一个一个介绍

        //2.1获取类的构造器
           //获取所有的构造器,包括私有和公有(方法中含有Declared就代表私有的一起获取)
     Constructor[] constructors= cls3.getDeclaredConstructors();
     for(Constructor con:constructors)
         System.out.println(con);
         //获取所有公有构造器
        Constructor[] constructors1= cls3.getConstructors();

        //获取指定的构造器   (参数为指定构造器的参数列表类型的字节码 如Integer.class 如果是无参,则填null)
        Constructor   constructor=cls3.getDeclaredConstructor(null);
        Constructor   constructor1=cls3.getDeclaredConstructor(Integer.class);

        Constructor   constructor2=cls3.getDeclaredConstructor(Integer.class,String.class);
        System.out.println(constructor);
        System.out.println(constructor2);

        //通过构造器来实例化对象(创建对象),如下 ,用newInstance()方法

        BookInfo bk1=(BookInfo)   constructor1.newInstance(100);//通过构造器来创建对象 其实Java中创建对象的实质就是调用构造方法
        System.out.println(bk1.getPrice());

        //如果通过私有构造器来实例化对象 则需要先取消语法检测
        constructor2.setAccessible(true);   //取消语法检测
        BookInfo bk2=(BookInfo)   constructor2.newInstance(101,"java反射全解");
        System.out.println(bk2);

        //如果通过无参构造器来实例化对象 可以直接cls3.newInstance();当然一般还是按规范来,没有这么写




        //2.2.获得类中的属性
        Field[] f_= cls3.getDeclaredFields();//获得全部属性 私有和共有
        Field  f_price=cls3.getDeclaredField("price");//字符串中的内容和BookInfo里的属性保持一致
          //对属性进行读写操作
           //考虑到price属性是私有的,需要先取消语法检测
           f_price.setAccessible(true);//取消语法检测
           //设置上面已创建的对象bk2的属性值
             f_price.set(bk2,103);
             //输出该图书对象的价格
        System.out.println(f_price.get(bk2));


        //2.3.获得类中的普通方法
      Method[]  methods=cls3.getDeclaredMethods();//获得类中的所有方法
        Method  methods1=cls3.getDeclaredMethod("setPrice",Integer.class);//获得类中的所有方法

     //如果该方法无参数,则Integer.class填null ,多个参数,则写多个.class
          //方法的调用
        methods1.invoke(bk1,10001);
            System.out.println(bk1.getPrice());//输出bk1对象的price,看是否已经改成了10001,是否调用成功。



    }
}

在代码中做了详细解释,不懂的可以留言。
反射主要在后面的框架中用的多,接下来,终于进入到spring的学习了,加油。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值