Java中的反射机制和总结。

前言:

1.     Java 文件被编译后,生成了 .class 文件, JVM 此时就要去解读 .class 文件 , 被编译后的 Java 文件 .class 也被 JVM 解析为 一个对象,这个对象就是 java.lang.Class . 这样当程序在运行时,每个 java 文件就最终变成了 Class 类对象的一个 实例。我们通过Java 的反射机制应用到这个实例,就可以去 获得甚至去添加改变这个类的属性和动作 ,使得这个类 成为一个动态的类 .

2.     用privite修饰的方法还是属性为了线程安全,在其他类中都不能访问,所以我们就想要获取怎么办,这里运用到了Java中的反射机制。

正文:

非常简单,我们举三个例子。

第一,获取私有的构造方法;

第二,获取私有的方法;

第三,获取私有的属性;

演示

第一,获取私有的构造方法;

先看这个类,有一个私有的带参数方法,我们可以先 获取这个类

1.怎么获取类

有三个方法,

 

第一种方法.通过getClass获取Class对象

Student s1 = new Student(); 
Class c1 = s1.getClass();

第二种方法直接通过 类名.class 的方式得到,该方法最为安全可靠,程序性能更高 这说明任何一个类都有一个隐含的静态成员变量 class

Class c2 = Student . class ;
第三种方法  通过 Class 对象的 forName() 静态方法来获取,用的最多,
但可能抛出 ClassNotFoundException 异常
Class c3 = null; 
try {
//注意这里是类的全路径,如果有包需要加包的路径
 c3 = Class.forName("Student"); 
} catch (ClassNotFoundException e) {
e.printStackTrace(); 
}

我其实推荐后两者,第一种太麻烦了;

2.获取类以后,然后再利用一个好东西,getDeclaredConstructor();获取私有的构造方法

括号里面传的参数类型

比如咱们的构造方法是这个,我们在括号里面传的就是 

getDeclaredConstructor(String,int)

错误,不能这么写,记住!!!

要这么写

 后面必须有Class的后缀

 

这一步很关键,不然会报错

其次你就可以传你要传的参数了

public static void reflect1() {
        //首先获取类名
        Class<?> c1 = Student.class;
        try {
            //然后用construct进行获取构造方法
            Constructor<?> constructor = c1.getDeclaredConstructor(String.class, int.class);
            //然后设置为True
            constructor.setAccessible(true);
            //然后传入参数
            Student student = (Student) constructor.newInstance("李华志", 19);

            System.out.println(student);

        } catch (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
        }

第二,获取私有的方法

 

首先,和上面一样,我们要先获取类 

然后利用getDeclaredMethod(String name, Class...<?> parameterTypes)这个函数来获取

然后在设置访问权限

最后再实例化一个对象,就可以用invoke调用这个方法了

 全部代码如下

//获取私有的方法
    public static void reflect3() {
        //首先肯定要先获取类名
        try {
            Class<?> c3 = Class.forName("TestDome.Student");
            //设置访问权限
            Method method = c3.getDeclaredMethod("display2", String.class);
            method.setAccessible(true);
            Student student = (Student) c3.newInstance();
            method.invoke(student, "LIHUAZHI");

        } catch (ClassNotFoundException | InvocationTargetException | InstantiationException | IllegalAccessException | NoSuchMethodException e) {
            e.printStackTrace();
        }
    }

最后老铁们,获取私有属性

我们利用

getDeclaredField(String name)
首先先获取类
然后设置权限为True;

总结

写到最后福利送上

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值