什么是反射?

什么是反射?,第1张

Java的反射
定义:Java反射机制在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java的反射机制。
简单的说,Java可以把类的属性和方法映射成一个个对象并使用。
常用的反射的方法

  • getDeclaredMethod
  • getMethod
  • Method.invoke(Object obj, Object… args)
  • getDeclaredField
  • getField

getDeclaredMethod 与getMethod区别

  • getDeclaredMethod可以获取类自己的所有方法(private,public,protected,默认包权限),类继承的方法与实现接口的方法是获取不到的
  • 使用getMethod可以获取public的方法、继承的方法、实现的接口的方法
  • 其它命名规则类似的方法区别相同(getDeclaredField与getField)

一个小栗子
Robot类
利用反射访问其方法与属性的ReflectSample类
Robot:

package com.nanmu.design.pattern.creational.singleton.reflect;

/**
 * @author ymn
 * @date 2022/5/10
 * @description 
 */
public class Robot {
    private String name;
    public void sayHi(String helloSentence){
        System.out.println(helloSentence + " " + name);
    }
    private String throwHello(String tag){
        return "Hello " + tag;
    }
}

ReflectSample:

package com.nanmu.design.pattern.creational.singleton.reflect;


import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @author ymn
 * @date 2022/5/10
 * @description 反射例子
 */
public class ReflectSample {
    public static void main(String[] args) throws Exception {
        //使用Class.forName方法加载类
        Class c = Class.forName("com.nanmu.design.pattern.creational.singleton.reflect.Robot");
        System.out.println("ClassName:" + c.getName());
        //创建对象实例
        Robot robot = (Robot) c.newInstance();
        //getDeclaredMethod可以获取类自己的所有方法(private,public,protected,默认包权限),类继承的方法与实现接口的方法是获取不到的
        Method throwHello = c.getDeclaredMethod("throwHello", String.class);
        //设置方法为可访问的
        throwHello.setAccessible(true);
        Object throwHelloResult = throwHello.invoke(robot, "HT");
        System.out.println("throwHello方法返回的结果是:" + throwHelloResult);
        //使用getMethod可以获取public的方法、继承的方法和实现的接口的方法
        Method sayHi = c.getMethod("sayHi", String.class);
        sayHi.invoke(robot, "Welcome");
        //获取私有属性并设置值
        Field name = c.getDeclaredField("name");
        name.setAccessible(true);
        name.set(robot,"Alice");
        //再次调用sayHi方法
        sayHi.invoke(robot, "Welcome");
    }
}

ReflectSample main方法执行结果为:

ClassName:com.nanmu.design.pattern.creational.singleton.reflect.Robot
throwHello方法返回的结果是:Hello HT
Welcome null
Welcome Alice

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/904947.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-15
下一篇 2022-05-15

发表评论

登录后才能评论

评论列表(0条)

保存