Java反射机制基本概念与相关Class类对反射机制的实现

1.何为反射

反射可以理解为一面镜子照射的实物的虚像映射回实物。在程序上即为通过实例化对象得到所属类的信息。
请添加图片描述

2.反射作用

Java反射机制可以动态获取程序信息和动态调用对象,即可以实现动态创建和动态编译对象。

1.1在运行状态中
(1)可以构造任意一个类的对象
(2)也可以获取任意一个对象所属类的信息
(3)甚至可以调用任意一个类成员变量和方法
(4)当然也可以获取任意一个对象的属性和方法
请添加图片描述

3.Class类实例化应用

3.1.进行Class类对象的实例化的三种方式

(1)依据全限类名;Class.forName(“全限定类名”)

Class<?> c=null;
c=Class.forName("com.item.类名");//com.item:所属包名
getName()方法可以获得包括所属包名的类名
getPackage()方法可以获取所属包名

(2)依据对象获取:对象名.getClass()

Class<?> c=null;
c=new 类名().getClass();

(3)依据类名获取:类名.class

Class<?> c=null;
c=类名.class;
3.2.Class类实例化其他类对象的两种方式
3.2.1.调用newInstance()通过无参构造方法实例化
package edu.day1;
import java.util.*;
public class Reflect {
   public static  void main(String[] args) throws InstantiationException, IllegalAccessException {
       Class<?> c=null;//?:占位符
       try {
           c=Class.forName("edu.day1.People");
       }
       catch (ClassNotFoundException e){
           e.printStackTrace();
       }
       People peo=null;
       peo=(People) c.newInstance();//实例化
       peo.setName("张小凡");
       peo.setNum(19);
       System.out.println(peo);
   }

}

class  People{
    private String name;
    private int num;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public People() {
    }

    public People(String name, int num) {
        this.name = name;
        this.num = num;
    }

    @Override
    public String toString() {
        return "People{" +
                "name='" + name + '\'' +
                ", num=" + num +
                '}';
    }
}

请添加图片描述

3.2.2.调用getConstructors()通过有参构造方法实例化

(1)getConstructors()获得实例化的类中全部构造方法
(2)获取有参构造方法对应的Constructor对象
(3)Constructor类实例化对象

package edu.day1;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Book {
    public  static void main(String[] args){
        Class<?> c=null;
        try {
            c=Class.forName("edu.day1.BookReading");
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
        BookReading book=null;
        Constructor<?> constructor[] =null;//此处获得对象数组
        constructor=c.getConstructors();//获取BookReading类的全部构造方法
        try {
            book=(BookReading) constructor[0].newInstance("碧瑶",19);//实例化BookReading对象
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        }
        System.out.println(book);


    }
}
class BookReading{
    private String bookname;
    private int index;

    public BookReading(String bookname, int index) {
        this.bookname = bookname;
        this.index = index;
    }

    public String getBookname() {
        return bookname;
    }

    public void setBookname(String bookname) {
        this.bookname = bookname;
    }

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }

    @Override
    public String toString() {
        return "BookReading{" +
                "bookname='" + bookname + '\'' +
                ", index=" + index +
                '}';
    }
}

请添加图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梅花与竹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值