短小精悍的JAVA反射机制

反射机制

20201222

17:10

 

注意一下反射机制的定义:

在运行状态中,对于任意一个类都能知道它的方法和属性,都可以调用它的方法和属性。

这种动态机制即是java反射机制。

获取class对象

知道具体类(不会初始化)

    1   System.out.println("1");

    2   Class al = TargetObject.class;

    3   System.out.println("2");

    4   Class al2 = Class.forName("com.learning.refect.TargetObject");

    5   System.out.println("3");

    6   TargetObject t = new TargetObject();

    7   Class al3 = t.getClass();

    8   System.out.println("4");

    9   Class al4 = ClassLoader.LoadClass("com.learning.refect.TargetObject");

上述是4种方法,注意到forName是会默认进行类初始化的,可以通过参数,指定不初始化。初始化,即类的初始化,这一步会运行类的static块和变量初始化的代码。

其他API

    1 package com.learning.refect;

    3 import java.lang.reflect.Field;

    4 import java.lang.reflect.InvocationTargetException;

    5 import java.lang.reflect.Method;

    7 public class Main {

    8     public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchFieldException {

    9         /**

   10          * 获取TargetObject类的Class对象并且创建TargetObject类实例

   11          */

   12         Class<?> tagetClass = Class.forName("com.learning.refect.TargetObject");

   13         TargetObject targetObject = (TargetObject) tagetClass.newInstance();

   14         /**

   15          * 获取所有类中所有定义的方法

   16          */

   17         Method[] methods = tagetClass.getDeclaredMethods();

   18         for (Method method : methods) {

   19             System.out.println(method.getName());

   20         }

   21         /**

   22          * 获取指定方法并调用

   23          */

   24         Method publicMethod = tagetClass.getDeclaredMethod("publicMethod", String.class);

   26         publicMethod.invoke(targetObject, "JavaGuide");

   27         /**

   28          * 获取指定参数并对参数进行修改

   29          */

   30         Field field = tagetClass.getDeclaredField("value");

   31         //为了对类中的参数进行修改我们取消安全检查

   32         field.setAccessible(true);

   33         field.set(targetObject, "JavaGuide");

   34         /**

   35          * 调用 private 方法

   36          */

   37         Method privateMethod = tagetClass.getDeclaredMethod("privateMethod");

   38         //为了调用private方法我们取消安全检查

   39         privateMethod.setAccessible(true);

   40         privateMethod.invoke(targetObject);

   41     }

   42 }

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值