多态(反射机制)

JAVA是一种支持反射机制的动态编译语言,允许在运行时确定类型。反射可用于获取类的属性、方法和构造器信息,实现多态和降低模块耦合,但也可能导致性能损耗。文章通过示例展示了如何获取Class对象、访问类信息以及如何在对象中使用反射。此外,还提到反射无法获取泛型的实际类型,但在运行时可以越过泛型检查。
摘要由CSDN通过智能技术生成

JAVA 是动态编译语言(运行时才确定类型),支持反射机制。在运行状态中

  • 对于任意一个类,都能够知道这个类的所有属性和方法;

  • 对于任意一个对象,都能够调用它的任意一个方法和属性。

通过反射机制能更好地支持多态,降低模块耦合,提高代码灵活度(根据传入类名不同,就能实例化出不同的对象)。

但是在性能上会有较大的损耗。

尽管在应用层面很少使用反射机制,但在设计基础框架的时候反射机制非常有用。

反射机制运用

类的相关信息保存在以下类中,通过特定方法获取其对象能够知道这个类的信息。

  • 类 类:

  • 构造函数类:类的构造方法

  • 字段类:类的属性

  • 方法类:类的方法

public class Reflection {    
public static void main(String[] args) {

        /************************** 获取 Class 对象 **************************/

        // 第一种方式 返回对象的类 【已有对象,获取类无意义】        
Student stu = new Student();        
Class stuClass = stu.getClass();
        // 第二种方式 获取数据类型的静态 class 属性 【需要导入类包】        
Class stuClass = Student.class;
        // 第三种方式 返回路径下的类 【常用】        
Class stuClass = Class.forName("Reflection.Student");
        /************************** 获取 Class 信息 **************************/

        // 获取类名        
String name = stuClass.getName());           
// 获取类的公有构造方法        
Constructor[] conArray = stuClass.getConstructors();        
// 获取类的全部构造方法        
Constructor[] conArray = stuClass.getDeclaredConstructors();        
// 获取类的指定构造方法(参数)        
Constructor con = stuClass.getConstructor(null);        
Constructor con = stuClass.getDeclaredConstructor(char.class);

        // 获取类的公有属性        
Field[] fieldArray = stuClass.getFields();         
// 获取类的全部属性        
Field[] fieldArray = stuClass.getDeclaredFields();        
// 获取类的指定属性(属性名)        
Field f = stuClass.getField("name");            
// 获取类的公有方法        
Method[] methodArray = stuClass.getMethods();         
// 获取类的全部方法                        
Method[] methodArray = stuClass.getDeclaredMethods();        
// 获取类的指定方法(方法名+形参类型)                          
Method m = stuClass.getMethod("main", String.class);           
/************************** 在对象中使用 **************************/

        Object obj = con.newInstance();   
// 调用公有无参构造方法创建对象        
f.set(obj, "X-man");              
// 为对象的公有属性赋值        
m.invoke(obj, "X-man");           
// 调用对象的公有方法
    }

泛型在编译时检查类型安全,编译过后泛型被擦除、实际类型才确定。反射是在编译期模拟 java 运行时的环境读取和调用程序,因此不能获得泛型的实际类型。但可以通过反射越过泛型检查:

在 String 泛型的集合中,你甚至可以添加一个 Integer 类型的值。

public class Demo {    
public static void main(String[] args) throws Exception{        
ArrayList<String> strList = new ArrayList<>();            
Class listClass = strList.getClass();         
Method m = listClass.getMethod("add", Object.class);        
m.invoke(strList, 100);    
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值