Java反射常用方法和总结(一)

7 篇文章 0 订阅
2 篇文章 0 订阅

反射是在java框架中经常接触到的一种方法,所谓的反射,及时给你一个xxx.class文件,通过反射方法, 能够拿到改xxx类相关的所有资源。
在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中
1、Class类:代表一个类。
2、Field 类:代表类的成员变量(成员变量也称为类的属性)。
3、Method类:代表类的方法。
4、Constructor 类:代表类的构造方法。
5、Array类:提供了动态创建数组,以及访问数组的元素的静态方法。
一、获取class对象的三种常用方法:
1、通过完整的包名.类名获取对应的class类对象

Class Class.forName(String packageNameAndClassName) throws ClassNotFoundException;

2、通过类名获取当前类对象对应的class类对象

Class 类对象.getClass();
例如:Person p = new Person();
     p.getClass()  ⇒ Person 类对应的Class对象

3、通过类名获取

Class 类名.class;
例如:Person.class ⇒  Person 类对应的Class对象
public class GetClassObject {
    public static void main(String[] args) throws ClassNotFoundException {
        //1、Class Class.forName(String packageNameAndClassName) throws ClassNotFoundException;
        Class cls1 = Class.forName("Person");

        //2、Class 类对象.getClass();
        Person  person = new Person();
        Class cls2 = person.getClass();

        //3、Class 类名.class
        Class cls3 = Person.class;
        System.out.println(cls3);
        System.out.println("cls1 == cls2 : " + (cls1 == cls2));
        System.out.println("cls2 == cls3 : " + (cls2 == cls3));
        System.out.println("cls3 == cls1 : " + (cls3 == cls1));
    }
}

!
总结:不管是通过哪一种方式获取指定类的class对象,都是同一个class对象,因为当前Person类在当前程序中有且只占用一次代码区空间。

二、操作Constructor构造方法类:
1、通过class类对象获取对应的Constructor构造方法类对象:

1.1 获取当前class对象对应的类中所有非私有化构造方法类对象数组。

constructor[]  getConstructors(); 
//1、获取当前Class对象对应的类中的所有非私有化构造方法对象数组
        Constructor[] constructors = cls.getConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }

1.2 暴力获取所有构造方法类对象数组,包括私有化构造方法。

Constructors[] getDeclaredConstructors();
//2、暴力获取所有的构造方法类对象数组(包括私有化)
        Constructor[] declaredConstructors = cls.getDeclaredConstructors();
        for (Constructor constructor : declaredConstructors) {
            System.out.println(constructor);
        }

1.3 根据指定的参数类型获取构造方法(非私有化)

Constructor getConstructor(Class... parameterTypes);
例如:
无参构造:cls.getConstructor();
两个参数构造方法:cls.getConstructor(int.class, String.class)

Class… parameterTypes :Class类型不定长参数,用于约束当前构造方法数据类型

Constructor constructor1 = cls.getConstructor();
        Constructor constructor2 = cls.getConstructor(int.class);
        Constructor constructor3 = cls.getConstructor(int.class, String.class);
        System.out.println(constructor1);
        System.out.println(constructor2);
        System.out.println(constructor3);

1.4 暴力获取指定数据类型的构造方法(包括私有化)

Constructor getDeclaredConstructor(Class... parameterTypes);
例如:获取私有化String类型的构造方法:
cls.getDeclearedConstructor(String.class);
 Constructor constructor4 = cls.getDeclaredConstructor(String.class);
        System.out.println(constructor4);

2、操作Constructor类对象创建对应类对象
2.1 通过Constructor类对象,执行对应的构造方法,创建对应的类对象

Object newInstance(Object... parameters);
例如:
Person();无参构造
Person p1 = (Person) constructor.newInstance();
Person(int, java.lang.String);
Person p2 = (Person)constructor.newInstance(10,"小明");
//5、newInstance 创建类对象
        Person p1 = (Person) constructor1.newInstance();
        Person p2 = (Person) constructor2.newInstance(10);
        System.out.println(p1);
        System.out.println(p2);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

何忧何虑

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

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

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

打赏作者

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

抵扣说明:

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

余额充值