cari
RumahJavajavaTutorialJava反射获取类和对象信息的详细介绍

反射可以解决在编译时无法预知对象和类是属于那个类的,要根据程序运行时的信息才能知道该对象和类的信息的问题。

在两个人协作开发时,你只要知道对方的类名就可以进行初步的开发了。

获取类对象

  • Class.forName(String clazzName)静态方法

  • 调用类的class属性,Person.class返回的就是Person的class对象(推荐使用)

  • 调用某个对象的getClass()方法

具体使用还是要根据实际来选择,第一种方式是比较自由的,只要知道一个类名就可以了,其不会做该类是否存在的校验,第二种、第三种则会做校验

获取类的信息

获取类构造器

  • Connstructor8742468051c85b06f0a0af9e3e506b5c getConstructor(Class6b3d0130bba23ae47fe2b8e8cddf0195...parameterTypes):返回此Class对象对应类的带指定形参的public构造器

  • Constructor6b3d0130bba23ae47fe2b8e8cddf0195[] getConstructors():返回此Class对象对应类的所有public构造器

  • Constructor8742468051c85b06f0a0af9e3e506b5c[] getDeclaredConstructor(Class6b3d0130bba23ae47fe2b8e8cddf0195...parameterTypes):返回此class对象对应类的带指定参数的构造器,与构造器的访问权限无关

  • Constructor6b3d0130bba23ae47fe2b8e8cddf0195[] getDeclaredConstructors():返回此class对象对应类的所有构造器,与构造器的访问权限无关

获取类成员方法

  • Method getMethod(String name,Class6b3d0130bba23ae47fe2b8e8cddf0195...parameterTypes):返回此class对象对应类的带指定形参的public方法

  • Method[] getMethods():返回此class对象所表示的类的所有public方法

  • Method getDeclaredMethod(string name,Class6b3d0130bba23ae47fe2b8e8cddf0195...parameterTypes):返回此class对象对应类的带指定形参的方法,与方法访问权限无关

  • Method[] getDeclaredMethods():返回此class对象对应类的全部方法,与方法的访问权限无关

获取类成员变量

  • Field getField(String name):返回此class对象对应类的指定名称的public成员变量

  • Field[] getFields():返回此class对象对应类的所有public成员变量

  • Field getDeclaredField(String name):返回此class对象对应类的指定名称的成员变量,与成员变量访问权限无关

  • Field[] getDeclaredFields():返回此class对象对应类的全部成员变量,与成员变量的访问权限无关

获取类注解

  • ff56b21ab54c6b5c37cb9b57f821804eA getAnnotation(Class72d4ced2cc960a6bc2541984146fdaaaannotationClass):尝试获取该class对象对应类上村子的指定类型的Annotation,如果该类型注解不存在,则返回null

  • ff56b21ab54c6b5c37cb9b57f821804eA getDeclaredAnnotation(Class72d4ced2cc960a6bc2541984146fdaaaannotationClass):这是Java 8中新增的,该方法获取直接修饰该class对象对应类的指定类型的Annotation,如果不存在,则返回null

  • Annotation[] getAnnotations():返回修饰该class对象对应类上存在的所有Annotation

  • Annotation[] getDeclaredAnnotations():返回修饰该Class对象对应类上存在的所有Annotation

  • ff56b21ab54c6b5c37cb9b57f821804eA[] getAnnotationByType(Class72d4ced2cc960a6bc2541984146fdaaaannotationClass):该方法的功能与前面介绍的getAnnotation()方法基本相似,但由于Java8增加了重复注解功能,因此需要使用该方法获取修饰该类的指定类型的多个Annotation

  • ff56b21ab54c6b5c37cb9b57f821804eA[] getDeclaredAnnotationByType(Class72d4ced2cc960a6bc2541984146fdaaaannotationClass):该方法发功能与前面介绍的getDeclaredAnnotations()方法相似,也是因为Java8的重复注解的功能,需要使用该方法获取直接修饰该类的指定类型的多个Annotation

获取该类内部类

  • Class6b3d0130bba23ae47fe2b8e8cddf0195[] getDeclaredClasses():返回该class队形对应类里包含的全部内部类

获取该类对象所在的外部类

  • Class6b3d0130bba23ae47fe2b8e8cddf0195 getDeclaringClass():返回该Class对象对应类所在的外部类

获取该类对象对应类所实现的接口

  • Class6b3d0130bba23ae47fe2b8e8cddf0195[] getInterfaces():返回该Class对象对应类所实现的全部接口

获取该类对象对应类所继承的父类

  • Class117c5a0bdb71ea9a9d0c2b99b03abe3e getSuperclass():返回该Class对象对应类的超类的Class对象

获取该类对象对应类的修饰符、所在包、类名等基本信息

  • int getModifiers():返回此类或接口的所有修饰符,修饰符由public、protected、private、final、static、abstract等对应的常量组成,返回的整数应使用Modifier工具类的方法来解码,才可以获取真是的修饰符

  • Package getPackage():获取该类的包

  • String getName():以字符串形式返回此CLass对象所表示的类的简称

判断该类是否为接口、枚举、注解类型

  • boolean isAnnotation():返回此class对象是否表示一个注解类型

  • boolean isAnnotationPresent(Classe7efc8cbc31a41b0598dead74d6893ddannotationClass):判断此Class对象是否使用类Annotation修饰

  • boolean isAnonymousClass():返回此class对象是否是一个匿名类

  • boolean isArray():返回此class对象是否表示一个数组

  • boolean isEnum():返回此class对象是否表示一个枚举

  • boolean isInterface():返回此class对象是否表示一个接口

  • boolean isInstance(<a href="http://www.php.cn/wiki/60.html" target="_blank">Object</a> obj):判断obj是否是此class对象的实例,该方法可以完全代替instanceof操作符

public interface Colorable {
     public void value();
}
public class ClassInfo {

    public static void main(String[] args) throws NoSuchMethodException, SecurityException {
        Class<Colorable> cls=Colorable.class;
        System.out.println(cls.getMethod("value"));
        System.out.println(cls.isAnnotation());
        System.out.println(cls.isInterface());
    }

}

结果

public abstract void com.em.Colorable.value()
false
true

Java8中新增的方法参数反射

  • int getParameterCount():获取该构造器或方法的形参个数

  • Parameter[] getParameters():获取该构造器或方法的所有形参

  • getModifiers():获取修饰该形参的修饰符

  • String getName():获取形参名

  • Type getParameterizedType():获取带泛型的形参类型

  • Class6b3d0130bba23ae47fe2b8e8cddf0195getType():获取形参类型

  • boolean isNamePresent():该方法返回该类的class文件中是否包含了方法的形参名信息

  • boolean isVarArgs():该方法用于判断该参数是否为个数可变的形参

public class Test {
    public void getInfo(String str,List<String>list){
        System.out.println("成功");
    }
}
public class ClassInfo {

    public static void main(String[] args) throws NoSuchMethodException, SecurityException {
        Class<Test> cls=Test.class;
        Method med=cls.getMethod("getInfo", String.class,List.class);
        System.out.println(med.getParameterCount());
        Parameter[] params=med.getParameters();
        System.out.println(params.length);
        for(Parameter par:params){
            System.out.println(par.getName());
            System.out.println(par.getType());
            System.out.println(par.getParameterizedType());
        }
    }

}

结果

2
2
arg0
class java.lang.String
class java.lang.String
arg1
interface java.util.List
java.util.List<java.lang.String>

反射生成对象

  • 使用Class对象的newInstance()方法创建Class对象的实例,该方法要求要有默认构造器(比较常用)

  • 先使用Class对象获取指定的Constructor对象,在调用Constructor对象的newInstance()方法来创建该Class对象对应类的实例

反射调用方法

  • Object invoke(Object obj,Object...args):该方法中的obj是执行该方法的主调,后面的args是执行该方法时传入该方法的实参

public class Test {

    public Test(String str) {
        System.out.println(str);
    }
    public void getInfo(String str){
        System.out.println(str);
    }
}
public class ClassInfo {

    public static void main(String[] args) throws Exception {
        Class<Test> cls=Test.class;
        Constructor<Test>construct=cls.getConstructor(String.class);
        Test test=construct.newInstance("初始化");
        Method med=cls.getMethod("getInfo", String.class);
        med.invoke(test, "调用方法成功");
    }

}

结果

初始化
调用方法成功

接下来看官仔细看下面的栗子

public class Test {

    public Test(String str) {
        System.out.println(str);
    }
    //私有方法
    private void getInfo(String str){
        System.out.println(str);
    }
}
public class ClassInfo {

    public static void main(String[] args) throws Exception {
        Class<Test> cls=Test.class;
        Constructor<Test>construct=cls.getConstructor(String.class);
        Test test=construct.newInstance("初始化");
      //为啥使用这个方法呢?
        Method med=cls.getDeclaredMethod("getInfo", String.class);
      //为啥使用这个方法呢?
        med.setAccessible(true);
        med.invoke(test, "调用方法成功");
    }

}

结果

初始化
调用方法成功

setAccessible(boolean flag):将值设为true,指示该Method在使用是应该取消Java语言的访问权限检查

访问成员变量值

  • getXxx(Object obj):获取obj对象的该成员变量的值。此处的Xxx对应8种基本类型,如果该成员变量的类型是引用类型的,则去掉Xxx部分

  • setXxx(Object obj,Xxx val):将obj对象的该成员变量设置为val值。此处的Xxx对应8中基本类型,如果该成员变量的类型是引用类型,则取消set后面的Xxx

以上两个方法可以方法所有的成员变量,包括private的私有成员变量

public class Test {
    private int num;

    public Test(String str) {
        System.out.println(str);
    }
    private void getInfo(String str){
        System.out.println(str);
    }
    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }

}
public class ClassInfo {

    public static void main(String[] args) throws Exception {
        Class<Test> cls=Test.class;
        Constructor<Test>construct=cls.getConstructor(String.class);
        Test test=construct.newInstance("初始化");
        Method med=cls.getDeclaredMethod("getInfo", String.class);
        med.setAccessible(true);
        med.invoke(test, "调用方法成功");
        Field fld=cls.getDeclaredField("num");
        fld.setAccessible(true);
        fld.setInt(test, 12);
        System.out.println(fld.getInt(test));
    }

}

结果

初始化
调用方法成功
12

操作数组

java.lang.reflect包下有一个Array类,其可以动态创建数组

static Object newInstance(Class6b3d0130bba23ae47fe2b8e8cddf0195componentType,int...length):创建一个具有指定的元素类型、指定维度的新数组

static xxx getXxx(Object array,int index):返回array数组中第index个元素。其中xxx是各种基本数据类型,如果数组元素是引用类型,则该方法变为get()

static void setXxx(Object array,int index,xxx val):将array数组中低index 个元素的值设为val,其中xxx是各种基本数据类型,如果数组元素是引用类型,则该方法变为set()

public class ArrayInfo {

    public static void main(String[] args) {
        Object arrays=Array.newInstance(String.class, 3);
        Array.set(arrays, 0, "第一个");
        Array.set(arrays, 1, "第二个");
        Array.set(arrays, 2, "第三个");
        System.out.println(Array.get(arrays, 2));
    }
}

Atas ialah kandungan terperinci Java反射获取类和对象信息的详细介绍. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
带你搞懂Java结构化数据处理开源库SPL带你搞懂Java结构化数据处理开源库SPLMay 24, 2022 pm 01:34 PM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于结构化数据处理开源库SPL的相关问题,下面就一起来看一下java下理想的结构化数据处理类库,希望对大家有帮助。

Java集合框架之PriorityQueue优先级队列Java集合框架之PriorityQueue优先级队列Jun 09, 2022 am 11:47 AM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于PriorityQueue优先级队列的相关知识,Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,下面一起来看一下,希望对大家有帮助。

完全掌握Java锁(图文解析)完全掌握Java锁(图文解析)Jun 14, 2022 am 11:47 AM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于java锁的相关问题,包括了独占锁、悲观锁、乐观锁、共享锁等等内容,下面一起来看一下,希望对大家有帮助。

一起聊聊Java多线程之线程安全问题一起聊聊Java多线程之线程安全问题Apr 21, 2022 pm 06:17 PM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于多线程的相关问题,包括了线程安装、线程加锁与线程不安全的原因、线程安全的标准类等等内容,希望对大家有帮助。

Java基础归纳之枚举Java基础归纳之枚举May 26, 2022 am 11:50 AM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于枚举的相关问题,包括了枚举的基本操作、集合类对枚举的支持等等内容,下面一起来看一下,希望对大家有帮助。

详细解析Java的this和super关键字详细解析Java的this和super关键字Apr 30, 2022 am 09:00 AM

本篇文章给大家带来了关于Java的相关知识,其中主要介绍了关于关键字中this和super的相关问题,以及他们的一些区别,下面一起来看一下,希望对大家有帮助。

Java数据结构之AVL树详解Java数据结构之AVL树详解Jun 01, 2022 am 11:39 AM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于平衡二叉树(AVL树)的相关知识,AVL树本质上是带了平衡功能的二叉查找树,下面一起来看一下,希望对大家有帮助。

一文掌握Java8新特性Stream流的概念和使用一文掌握Java8新特性Stream流的概念和使用Jun 23, 2022 pm 12:03 PM

本篇文章给大家带来了关于Java的相关知识,其中主要整理了Stream流的概念和使用的相关问题,包括了Stream流的概念、Stream流的获取、Stream流的常用方法等等内容,下面一起来看一下,希望对大家有帮助。

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

VSCode Windows 64-bit Muat Turun

VSCode Windows 64-bit Muat Turun

Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

MantisBT

MantisBT

Mantis ialah alat pengesan kecacatan berasaskan web yang mudah digunakan yang direka untuk membantu dalam pengesanan kecacatan produk. Ia memerlukan PHP, MySQL dan pelayan web. Lihat perkhidmatan demo dan pengehosan kami.

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Integrasikan Eclipse dengan pelayan aplikasi SAP NetWeaver.