IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java反射的简单使用 -> 正文阅读

[Java知识库]Java反射的简单使用

Java反射的简单使用

前言:什么是java反射?

? JAVA机制反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

使用Java反射的三种方式
  1. 对象名 . getClass();
  2. 类名 . class;
  3. Class . forName( " 类的路径 " )(常用)
1. 创建一个MyTest类,封装私有属性,使用反射来操作MyTest类
package cn.kgc.util;
public class MyTest {
    private int id;
    private String name;
    private int age;

	//私有方法
	private void test(int ids){
        System.out.println("ids = " + ids+ids);
    }
    public MyTest() {
    }
    @Override
    public String toString() {
        return "MyTest{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

2. 使用第一种方式 “对象名 . getClass();” ,获取并使用MyTest类的私有方法"test"
    @Test
    public void S3() throws InvocationTargetException, IllegalAccessException {
        //创建MyTest对象
        MyTest myTest = new MyTest();
        //使用对象名.getClass方法
        Class<? extends MyTest> aClass = myTest.getClass();
        //获取MyTest所有方法,返回Method数组
        Method[] declaredMethods = aClass.getDeclaredMethods();
        //遍历Method数组
        for (Method declaredMethod : declaredMethods) {
            //打印MyTest下所有的方法
            System.out.println("declaredMethod = " + declaredMethod.getName());
            //---------------------------------------------------------------------------
            //获取的私有构造进行暴力访问,如果想要访问请打开权限为[true].
            declaredMethod.setAccessible(true);
            //如果得到的方法名与私有方法test相同,调用declaredMethod的invoke方法,向test里面赋值1
            if (declaredMethod.getName() == "test"){
                declaredMethod.invoke(myTest,1);
            }
        }
    }
------------------------------------------------ S3 输出数据 --------------------------------------------------
declaredMethod = toString
declaredMethod = getName
declaredMethod = getId
declaredMethod = setName
declaredMethod = test
ids = 11    //这是test方法的打印结果
declaredMethod = setId
declaredMethod = setAge
declaredMethod = getAge
3. 使用第二种方式 “类名 . class;” ,获取并使用MyTest类的私有方法"test"
    @Test
    public void S1() throws InvocationTargetException, IllegalAccessException {
        Class b = MyTest.class;
        Method[] methods = b.getDeclaredMethods();
        for (Method method : methods) {
            method.setAccessible(true);
            if (method.getName()=="test"){
                MyTest myTest = new MyTest();
                method.invoke(myTest,1);
            }
        }
    }
4. 使用第三种方式 “Class . forName(String pathName )” ,获取并使用MyTest类的私有方法"test"
    @Test
    public void S4() throws ClassNotFoundException, InvocationTargetException, IllegalAccessException {
        Class<?> aClass = Class.forName("cn.kgc.util.MyTest");
        Method[] declaredMethods = aClass.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            declaredMethod.setAccessible(true);
            if (declaredMethod.getName() == "test"){
                MyTest myTest = new MyTest();
                declaredMethod.invoke(myTest,3);
            }
        }
    }
最后:Java封装和Java反射是不是冲突呢,Java反射会不会破坏Java封装的封装性?

?······ 首先,封装是将具体的实现细节隐藏,而把功能作为整体提供给类的外部使用,也就是说,公有方法能够完成类所具有的功能。当别人使用这个类时,如果通过反射直接调用私有方法,可能根本实现不了类的功能,甚至可能会出错,因此通过反射调用私有方法可以说是没有任何用处的,开发人员没有必要故意去破坏封装好的类。从这点上看,封装性并没有被破坏。(摘自百度问答)
······个人的见解:反射确实可以得到一切 类中的东西(包括私有的属性、方法等),但是或许不算是破坏封装,私有方法是为了让继承的类无法使用,避免调用那些被设为私有的方法出现一些不必要的错误。这就是封装性。反射虽然可以获取私有方法并使用方法,只能说是其功能强大,可以在保证在调用私有方法不会出现错误,但是并没有反射调用方法后,该方法就不是私有的了。他仍然是私有的,仍然在子类中不可见。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 20:35:37  更:2022-03-21 20:39:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:47:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码