java高级特性——反射基础实例详细解读

本文详细介绍了Java的反射机制,包括获取Class对象的三种方式、通过反射创建对象、访问私有方法和属性、获取父类及接口等。通过实际的Student类示例,深入解析了反射在实际编程中的应用。
摘要由CSDN通过智能技术生成

java的反射机制是Java的特性之一,是构建框架技术的基础所在

目录

反射的概念

反射的使用(这里使用Student类做演示)

1、获取Class对象的三种方式

2、通过反射获取构造方法并使用:

2.1获取无参构造方法并创建对象

2.2获取有参构造方法并创建对象

3.获取成员方法并调用

3.1获取私有方法,有返回值无参

 3.2获取私有方法,无返回值有参

3.3使用对象强行对属性赋值

4.获取父类对象

4.1 利用父类对象获取方法

5.获取接口

6.补充:写个方法能够获取任意类型的对象

附上源码:


反射的概念

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

总之

反射就是把java类中的各种成分映射成一个个的Java对象
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
     (其实:一个类中这些成员方法、构造方法、在加入类中都有一个类来描述)
如图是类的正常加载过程:反射的原理在与class对象。
熟悉一下加载的时候:Class对象的由来是将class文件读入内存,并为之创建一个Class对象。

反射的使用(这里使用Student类做演示)

1、获取Class对象的三种方式

1.1 Object ——> getClass();
1.2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性
1.3 通过Class类的静态方法:forName(String  className)(常用)

其中1.1是因为Object类中的getClass方法、因为所有类都继承Object类。从而调用Object类来获取
 

public class TestReflect {
    public static void main(String[] args)throws Exception {
        //1.获取类型Class
        Class<Student> sc = Student.class;//1.1使用类型.class获取,因为Object类中的getClass方法、因为所有类都继承Object类。从而调用Object类来获取
        Student s=new Student();//由于s的类型不能确定具体的对象地址(可能是子类类型)
        Class<?extends Student> sc1=s.getClass();//1.2使用对象.getClass获取,任何数据类型(包括基本数据类型)都有一个“静态”的class属性
        Class<?> sc2 = Class.forName("cn.kgc.Student");//1.3使用Class类的静态方法:forName(String  className)(常用)

    }


}

2、通过反射获取构造方法并使用:

Student类:

public class Student extends Human implements Talkable {
public int stuNo;
private double score;


    public Student() {
    }

    public Student(int stuNo, double score) {
        this.stuNo = stuNo;
        this.score = score;
    }

    private Student(int stuNo, double score,String name) {
        this.stuNo = stuNo;
        this.score = score;
        setName(name);
    }

    private int getStuNo() {
        return stuNo;
    }

    private void setStuNo(int stuNo) {
        this.stuNo = stuNo;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }
}

2.1获取无参构造方法并创建对象

 //2.1获取公有的,无参的构造方法并创建对象
        Constructor<Student> c = sc.getConstructor(null);//因为是无参的构造方法所以类型是一个 
                                                          //null,不写也可以:这里需要的是一个                   
                                                           //参数的类型,切记是类型
        Student s = c.newInstance();//返回的是描述这个无参构造函数的类对象
        System.out.println(s);
    }

去掉student无参构造的public修饰符                                                  改为私有

                 

 Constructor<Student> c = sc.getDeclaredConstructor();//2.2获取构造方法并调用,无论公共还是私有
        c.setAccessible(true);//跟Student类不在同一个包,强行获取访问权限(忽略访问修饰符)
        Student s = c.newInstance();//通过构造方法创建了一个Student类型的变量(对象)
        System.out.println(s);
    }

 结果都为:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值