【JavaSE基础】第十七章:反射+设计模式

一、反射

1.反射(Reflection):允许在程序运行状态中,可以获取任意类中的属性和方法,并且可以操作任意对象内部的属性和方法,这种动态获取类的信息及动态操作对象的属性和方法对应的机制称为反射机制。

2.类对象 和 类的对象(实例)

(1) 类的对象(实例):基于某个类 new 出来的对象,也称为实例对象。

(2) 类对象:类加载的产物,封装了一个类的所有信息(包、类名、父类、接口、属性、方法、构造方法等)

3.获取类对象的三种方式:

(1) 通过类的对象,获取类对象

java 复制代码
Student s = new Student();
Class c = s.getClass();

(2) 通过类名获取类对象

Class c = 类名 .class;

(3) 通过静态方法获取类对象

Class c=Class.forName("包名 . 类名 ");

注意:需要 权限类名:包名. 类名

java 复制代码
public class TestClass {
        public static void main(String[] args) throws ClassNotFoundException {
                // 深入JVM 实现原理 / JVM 规范
                // 通过反射技术 获取 类对象
                Student s = new Student(); // 类的对象,实例
                Class c=s.getClass(); // 获取类对象
                System.out.println(c);
                // 第二种方式:
                Class c2=Class.forName("testflect.Student");
                System.out.println(c2);
                System.out.println(c==c2);
                Class c3 = Student.class;
                System.out.println(c3);
        }
}

4.反射常见的方法:

java 复制代码
Class c = Class.forName("testflect.Student");
        // 动态 操作类中信息
        System.out.println(c.getName());// 获取类名
        System.out.println(c.getPackage().getName());// 获取包名
        System.out.println(c.getSuperclass().getName()); // 获取父类
        Class[] cs=c.getInterfaces();// 获取 实现的接口
        System.out.println("实现的接口数量为: "+cs.length);
        for(Class inter:cs){
                System.out.println(inter.getName());
        }
        Method[] ms = c.getMethods();// 获取公开方法:自定义 + 父类中
        System.out.println("Student类定义的方法数量为: "+ms.length);
        for(Method m:ms){
                System.out.println(m.getName());
        }
        System.out.println("--------------");
        Method[] mds = c.getDeclaredMethods();// 获取自定义方法,包含非公开的
        System.out.println("Student类中自定义的方法为: "+mds.length);
        for(Method m:mds){
                System.out.println(m.getName());
        }
        System.out.println("获取属性: ");
        Field[] fs = c.getDeclaredFields();// 获取自定义属性:包含非公开的
        for (Field f:fs){
                System.out.println(f.getName());
        }

通过反射技术获取实例:

// 通过类对象 获取 类的对象

--- 采用无参数的构造方法获取对象

java 复制代码
Class c = Class.forName("testflect.Student");
Object obj = c.newInstance();// 默认采用无参数的构造方法
Student s =(Student)obj;
s.setName(" 佳明 ");
s.setAge(28);
s.setScore(99.0);
System.out.println(obj);

-- 采用有参数的构造方法获取对象

java 复制代码
System.out.println(" 利用有参数的构造方法获取对象: ");
Constructor con=c.getConstructor(String.class,Integer.class,Double.class);
Object obj2=con.newInstance(" 杨浩 ",37,88.0);
System.out.println(obj2);
// 利用反射技术操作私有化的方法
Method md=c.getDeclaredMethod("test");
md.setAccessible(true);
md.invoke(obj2);
相关推荐
香辣牛肉饭23 分钟前
【算法】动态规划 最长公共子序列(LCS)
经验分享·笔记·算法·动态规划
迷途呀29 分钟前
Python:函数中的参数类型
开发语言·笔记·python·langchain·nlp
依然范特东2 小时前
动手学深度学习笔记--卷积层、微调
人工智能·笔记·深度学习
金伟API10243 小时前
SQL Server基础学习笔记
笔记·学习
砚凝霜4 小时前
软考网络工程师|第 1 章 计算机网络基础 完整备考笔记
网络·笔记·计算机网络
岑梓铭4 小时前
《考研408数据结构》第七章(7.1 查找:顺序查找、折半查找、分块查找)复习笔记
数据结构·笔记·考研·408·ds·查找
金伟API10244 小时前
常见的SQL面试题:经典50例
数据库·人工智能·笔记·sql·学习
DES 仿真实践家5 小时前
Plant Simulation SimTalk基础教程(3)SimTalk 变量与数据类型
开发语言·笔记·学习
逸模6 小时前
多业态连锁,如何同步铺开各类门店
大数据·人工智能·笔记·工程·公装·连锁店
乐橙开放平台7 小时前
明厨亮灶笔记:乐橙轻应用 H5 + 小程序插件,一套 BFF 出两张播放凭证
人工智能·笔记·物联网·小程序·音视频·notepad++