Java反射第四部分:获取构造方法和获取继承关系

本文详细介绍了Java反射中如何获取构造方法,包括无参数构造方法与带参数构造方法的调用,以及如何处理非public构造方法。同时,文章探讨了Java类的继承关系,如获取父类和接口,以及`isAssignableFrom()`方法与`instanceof`关键字的差异。通过实例展示了这两个方法在判断类间关系时的不同应用场景。
摘要由CSDN通过智能技术生成

转载请注明出处:https://blog.csdn.net/jiyisuifeng222/article/details/117702827

本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 情花打雪 即可关注,每个工作日都有文章更新。

本篇文章主要讲解Java反射中构造方法和继承关系相关操作:

  1. 获取构造方法

  2. 获取继承关系

  3. isAssignableFrom()方法与instanceof关键字的区别

获取构造方法:

使用new操作符创建实例:

Student p = new Student();

通过反射创建新实例,可以调用Class提供的newInstance()方法:

Student p = Student.class.newInstance();

调用Class.newInstance()的局限是,它只能调用该类的public无参数构造方法。
如果构造方法带有参数,或者不是public,就无法直接通过Class.newInstance()来调用。


为了调用任意的构造方法,Java的反射API提供了Constructor对象,它包含一个构造方法的所有信息,可以创建一个实例。
Constructor对象和Method非常类似,不同之处仅在于它是一个构造方法,并且,调用结果总是返回实例.示例如下

public class MainTestDemo {

    public static void main(String[] args) throws Exception {

        // 获取构造方法Integer(int):
        Constructor constructor1 = Integer.class.getConstructor(int.class);

        // 调用构造方法:
        Integer integer = (Integer) constructor1.newInstance(123);

        System.out.println(integer);


        // 获取构造方法Integer(String)
        Constructor constructor2 = Integer.class.getConstructor(String.class);

        Integer n2 = (Integer) constructor2.newInstance("888");

        System.out.println(n2);

    }

}

通过Class实例获取Constructor的方法总结如下:

  • getConstructor(Class...):获取某个publicConstructor//
  • getDeclaredConstructor(Class...):获取某个Constructor
  • getConstructors():获取所有publicConstructor
  • getDeclaredConstructors():获取所有Constructor

注意:Constructor总是当前类定义的构造方法,和父类无关,因此不存在多态的问题。

调用非publicConstructor时,必须首先通过setAccessible(true)设置允许访问setAccessible(true)可能会失败。

 

获取继承关系

通过Class对象可以获取继承关系:

  • 1.Class getSuperclass():获取父类类型;(单继承)
  • 2.Class[] getInterfaces():获取当前类实现的所有接口;(多实现)
  • 3.通过Class对象的isAssignableFrom()方法,判断Class向上转型是否可以实现。

1.获取父类类型

public class MainTestDemo {

    public static void main(String[] args) throws Exception {

        Class i = Integer.class;

        Class n = i.getSuperclass();

        System.out.println(n);

        Class o = n.getSuperclass();

        System.out.println(o);

        System.out.println(o.getSuperclass());

    }

}

输出:

class java.lang.Number

class java.lang.Object

null

Integer的父类类型是NumberNumber的父类是ObjectObject的父类是null。除Object外,其他任何非interfaceClass都必定存在一个父类类型。

 

2.获取当前类实现的所有接口

public class MainTestDemo {

    public static void main(String[] args) throws Exception {
        Class s = Integer.class;
        Class[] is = s.getInterfaces();
        for (Class i : is) {
            System.out.println(i);
        }
    }
}

输出Integer实现的接口有:

java.lang.Comparable
java.lang.constant.Constable
java.lang.constant.ConstantDesc

要特别注意:getInterfaces()只返回当前类直接实现的接口类型并不包括其父类实现的接口类型。

   此外,对所有interfaceClass调用getSuperclass()返回的是null,获取接口的父接口要用getInterfaces()

System.out.println(java.io.DataInputStream.class.getSuperclass()); // java.io.FilterInputStream,因为DataInputStream继承自FilterInputStream
System.out.println(java.io.Closeable.class.getSuperclass()); // null,对接口调用getSuperclass()总是返回null,获取接口的父接口要用getInterfaces()

如果一个类没有实现任何interface,那么getInterfaces()返回空数组。

 

3.判断Class向上转型

在非反射调用中,当我们判断一个实例是否是某个类型时,正常情况下,使用instanceof操作符

Object n = Integer.valueOf(123);
boolean isDouble = n instanceof Double; // false
boolean isInteger = n instanceof Integer; // true
boolean isNumber = n instanceof Number; // true
boolean isSerializable = n instanceof java.io.Serializable; // true

如果是两个Class实例,要判断一个向上转型是否成立,可以调用isAssignableFrom()

// Integer i = ?
Integer.class.isAssignableFrom(Integer.class); // true,因为Integer可以赋值给Integer

// Number n = ?
Number.class.isAssignableFrom(Integer.class); // true,因为Integer可以赋值给Number

// Object o = ?
Object.class.isAssignableFrom(Integer.class); // true,因为Integer可以赋值给Object

// Integer i = ?
Integer.class.isAssignableFrom(Number.class); // false,因为Number不能赋值给Integer

 

isAssignableFrom()方法与instanceof关键字的区别

总结为以下两个点:

isAssignableFrom()方法是从类继承的角度去判断,instanceof关键字是从实例继承的角度去判断
isAssignableFrom()方法是判断是否为某个类的父类,instanceof关键字是判断是否某个类的子类
 

使用方法:

父类.class.isAssignableFrom(子类.class)

子类实例 instanceof 父类类型

isAssignableFrom()方法的调用者和参数都是Class对象调用者为父类,参数为本身或者其子类
instanceof关键字两个参数,前一个为类的实例,后一个为其本身或者父类的类型。

关注我的技术公众号,每天都有优质技术文章推送。

微信扫一扫下方二维码即可关注:

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值