栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

什么是反射?

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

什么是反射?

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;


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;


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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/873811.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号