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

3.反射机制

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

3.反射机制

1.反射机制概述

(1)reflection反射机制被视为动态语言(运行时改变内部结构的语言)的关键,借助于反射API取得任何累的内部信息,并能直接操作任意对象的内部属性和方法。

(2)加载完类之后,在堆内存的方法中就产生了一个Class类型的对象,这个对象包含了完整的类的结构信息,可以通过这个类看到类的结构。

// 反射: 实例化对象---------》getclass()方法---------------》得到完整的“包类”信息

(3)功能:

在运行时 判断对象所属的类、构造任意一个类的对象、判断任意一个类所具有的成员变量和方法、获取泛型信息 、调用任意一个对象的成员变量和方法、处理注解,生成动态代理

API:java.lang.Class 代表一个类

java.lang.reflect.Method 代表类方法

java.lang.reflect.Field 代表类的成员变量

java.lang.reflect.Construtor 代表类的构造器

package com.qiku.reflection;

import org.junit.Test;

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


public class TestReflection {
    //反射之前
    @Test
    public  void test01(){
        //创建Person对象
        Person p1 = new Person("tom",12);
        p1.age=10;
        System.out.println(p1);//Person{name='tom', age=10}
        p1.show();
        //不可调用其私有的成员变量和方法 例如 name 和shownation()

    }
    //反射之后 对于Person的操作
    @Test
    public  void test02() throws Exception {
        Class cc= Person.class;
        // 通过反射 创建 person对象
        Constructor cons = cc.getConstructor(String.class, int.class);

        Object obj = cons.newInstance("Tom", 12);

        Person p=(Person)obj;
        System.out.println(p.toString());
        //通过反射 获取对象指定的属性和方法
        Field age = cc.getDeclaredField("age");
        age.set(p,10);//
        System.out.println(p.toString());//Person{name='Tom', age=10}
        Method show = cc.getDeclaredMethod("show");
        System.out.println(show);
        //通过反射 可以调用 Person类的私有属性,比如私有的构造器方法和属性

        //调用私有的构造器
        Constructor cons1 = cc.getConstructor(String.class);
        //值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java
        // 语言访问检查;实际上setAccessible是启用和禁用访问安全检查的开关,并不是为true就能访问为false就不能访问 ;
        //由于JDK的安全检查耗时较多.所以通过setAccessible(true)的方式关闭安全检查就可以达到提升反射速度的目的

        cons1.setAccessible(true);
        Person p1 =(Person) cons1.newInstance("Jerry");
        System.out.println(p1);
        //调用私有的属性
        Field name = cc.getDeclaredField("name");
        name.setAccessible(true);
        name.set(p1,"Jack");
        System.out.println(p1);
        //调用私有的方法
        Method showNation = cc.getDeclaredMethod("showNation",String.class);
        showNation.setAccessible(true);
        //相当于  p1.showNation("中国"); 调用完此方法有个返回值  invoke的返回值就是nation
        String nation = (String)showNation.invoke(p1, "中国");
        System.out.println(nation);


    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/949403.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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