第六章:反射+设计模式

一、反射

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

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

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

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

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

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

Student s = new Student();

Class c = s.getClass();

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

Class c = 类名.class;

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

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

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

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);

}

}

  1. 反射常见的方法:

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());

}

通过反射技术获取实例:

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

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

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); -- 采用有参数的构造方法获取对象 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);

相关推荐
wanghowie9 小时前
01.08 Java基础篇|设计模式深度解析
java·开发语言·设计模式
syt_101311 小时前
设计模式之-中介者模式
设计模式·中介者模式
明洞日记11 小时前
【设计模式手册023】外观模式 - 如何简化复杂系统
java·设计模式·外观模式
游戏23人生12 小时前
c++ 语言教程——16面向对象设计模式(五)
开发语言·c++·设计模式
watersink13 小时前
Agent 设计模式
开发语言·javascript·设计模式
老朱佩琪!13 小时前
Unity策略模式
unity·设计模式·策略模式
o0向阳而生0o13 小时前
116、23种设计模式之责任链模式(23/23)(完结撒花)
设计模式·责任链模式
山沐与山1 天前
【设计模式】Python模板方法模式:从入门到实战
python·设计模式·模板方法模式
阿拉斯攀登1 天前
设计模式:责任链模式
设计模式·责任链模式
崎岖Qiu1 天前
【设计模式笔记18】:并发安全与双重检查锁定的单例模式
java·笔记·单例模式·设计模式