第六章:反射+设计模式

一、反射

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

相关推荐
杨充7 小时前
10.可测试性实战设计
设计模式·开源·代码规范
杨充7 小时前
9.重构十二式的实战
设计模式·开源·代码规范
杨充7 小时前
6.设计原则的全景图
设计模式·开源·全栈
杨充7 小时前
2.面向对象的特性
设计模式
杨充7 小时前
7.SOLID原则案例汇
设计模式·开源·全栈
杨充7 小时前
8.反模式与坏味道
设计模式·开源·代码规范
杨充7 小时前
3.接口vs抽象类比较
设计模式
咖啡八杯10 小时前
文法、BNF与AST
java·设计模式·解释器模式·ast·文法
咖啡八杯19 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式