反射

反射是Java中最强大的技术了,但是java反射影响性能

1、获取Class对象的三种方式
1.1 Object ——> getClass();
1.2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性
1.3 通过Class类的静态方法:forName(String className)

public class Student {

    private String name;
    private Integer age;
    private List<String> hobbys;

    public Student() {
    }

    public Student(String name, Integer age, List<String> hobbys) {
        this.name = name;
        this.age = age;
        this.hobbys = hobbys;
    }
}

反射创建对象
在这里插入图片描述
反射获取构造方法


/*
 * 通过Class对象可以获取某个类中的:构造方法、成员变量、成员方法;并访问成员;
 * 
 * 1.获取构造方法:
 * 		1).批量的方法:
 * 			public Constructor[] getConstructors():所有"公有的"构造方法
            public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)
     
 * 		2).获取单个的方法,并调用:
 * 			public Constructor getConstructor(Class... parameterTypes):获取单个的"公有的"构造方法:
 * 			public Constructor getDeclaredConstructor(Class... parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有;
 * 		
 * 			调用构造方法:
 * 			Constructor-->newInstance(Object... initargs)
 */

在这里插入图片描述

反射

当类中方法定义为私有的时候我们不能调用
当变量是私有的时候我们不能获取
但是反射可以,可以通过反射去执行这个私有方法,并且获取私有变量

1 构造方法

测试类

public class Test{
    private Integer age;
    private String name;
    private Integer intTest;


    public Test() {
    }

    public Test(Integer age) {
        this.age = age;
    }

    public Test(Integer age, String name) {
        this.age = age;
        this.name = name;
    }

    public Test(String name) {
        this.name = name;
    }
}

1.1 获取所有的构造方法

在这里插入图片描述
在这里插入图片描述
1.2 通过反射构造方法创建对象

Constructor declaredConstructor = aClass.getDeclaredConstructor(Integer.class, String.class);
Object newInstance1 = declaredConstructor.newInstance(18, "简素言");
System.out.println(newInstance1);


Constructor declaredConstructor1 = aClass.getDeclaredConstructor(String.class);
declaredConstructor1.setAccessible(true);
Object newInstance2 = declaredConstructor1.newInstance("裴罗嘉");
System.out.println(newInstance2);

在这里插入图片描述
1.3 私有化构造方法创建对象

在这里插入图片描述
在这里插入图片描述

2 方法

私有方法执行,公有方法执行
在Test类中加入两个方法,一个私有,一个公共
getDeclaredMethod方法获取到这个私有方法,第一个参数是方法名,第二个参数是参数类型。然后通过invoke方法执行,invoke需要两个参数一个是类的实例,一个是方法参数。

2.1 获取指定的方法并执行

            Method play = aClass.getDeclaredMethod("play", null);
            play.invoke(test,null);

            Method say = aClass.getDeclaredMethod("say", String.class);
            Object stringSay="you are J-Dragon";
            say.setAccessible(true);
            say.invoke(test,stringSay);

在这里插入图片描述

在这里插入图片描述
2.2 获取该类所有方法

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值