`

反射与多态

阅读更多

 先自定义一对父类与子类

public class A_For_Reflect_Instance_and_Polymorphism {
	private int my_field=0;
	public void my_method(){
		System.out.println("这是A的方法");
	}
}

 

public class AA_For_Reflect_Instance_and_Polymorphism extends A_For_Reflect_Instance_and_Polymorphism {
	public void my_method(){
		System.out.println("这是AA的方法");
	}
	
	public void not_in_A_method(){
		System.out.println("这是AA的方法.A中没有这个方法");
	}
	
}

  

  A_For_Reflect_Instance_and_Polymorphism 以下简称A。

AA_For_Reflect_Instance_and_Polymorphism以下简称AA。

 

对于多态的普通展示一般有:

A a=new AA();//a的编译时为A。a的运行运行时为AA。a只能使用A中的方法。但实际使用却是AA中继承与重写的方法。
a.my_method();//调用AA中的方法。
a.not_in_A_method();//无法通过编译。

 以上理所当然。

我的疑问来自看到有些人用反射时是这样的。

Class c_a=Class.forName("A");
A a=(A)c_a.newInstance();

 

使用强转来确定a对象。这让我很不爽。因为我觉得这样强转就失去了Java反射的动态意义了。

于是乎就想直接用Object自然的接收newInstance()方法所返回的Object对象。

Class c_a=Class.forName("A");
Object obj=obj.newInstance();

 

但是这样会不会受到编译时类是Object的限制。导致我非Object的方法便不能用了?

如果这样

obj.my_method();

确实无法使用。编译无法通过。

但是使用反射。便可以调用。

Method method1=c_a.getMethod("my_method");
method1.invoke(obj);

 

这样利用Java反射实现动态语言的一些特性便可以实现。只是这代码写起来实在是太冗长了。

 

另外需要说明一下,方法getClass()所得到的是对象运行时类的Class

 

Object obj=new A();
System.out.println(obj.getClass());
//所得到的结果为
// class A

 

 

下面是我实验中的执行代码。

import java.lang.reflect.Method;

public class Reflect_Instance_and_Polymorphism {
	public static void main(String[] args) throws Exception {
		//普通多态
		A_For_Reflect_Instance_and_Polymorphism a_obj=new AA_For_Reflect_Instance_and_Polymorphism();
		a_obj.my_method();
		
		
		System.out.println();
		//反射多态       测试
		Class c=a_obj.getClass();
		System.out.println("obj.getClass返回的类为"+c+"此为运行时类");
		Object obj=c.newInstance();//实例化
		try{
			//obj.my_method();
		}catch(Exception e){
			
		}finally{
			System.out.println("obj在编译时是Object的。obj无法调用my_method。");
		}
		
		System.out.println();
		System.out.println("用反射调用对象的方法");
		Method method1=c.getMethod("my_method");
		method1.invoke(obj);
		System.out.println("用反射即调用运行时方法");
		
		
		Method method2=c.getMethod("not_in_A_method");
		method2.invoke(obj);
		System.out.println("反射调用的方法无视编译时。所调用的方法取决于Class对象所对应的类。");
		
	}
}

 

 

分享到:
评论

相关推荐

    OOExample继承多接口反射在多态时的比较(VB.net)

    6. 反射与多态的结合:反射可以在运行时动态地识别和调用多态方法。例如,可以使用反射来获取对象的类型信息,然后根据其实际类型动态调用适当的方法。这在处理未知类型的对象或实现通用算法时特别有用。 总结来说...

    基于JDK接口、多态、继承、封装与反射的Java编程学习源码

    该项目是一个专注于Java编程基础学习的源码集,涵盖JDK接口、多态、继承、封装与反射等核心概念。源码集包含43个文件,其中Java源文件22个,CSS样式文件7个,以及HTML、下载链接、文档和其他辅助文件。通过这个源码...

    Java继承和多态详解及其综合应用

    文章还包括了一些进阶技巧,如接口与抽象类的区别与使用、动态绑定与静态绑定、Java反射与Lambda表达式的结合等。并给出了最佳实践建议。 适合人群:具备一定Java编程基础的开发者。 使用场景及目标:适用于初学者和...

    JAVA 多态 由浅及深介绍

    此外,多态与重载的混合使用在面试中经常出现。例如,类`A`中定义了两个`show`方法,分别接受`D`和`A`类型的参数,而类`B`继承自`A`并重写了`show(D)`方法。此时,如果有一个`B`类型的对象`b`,并使用`A`类型的引用...

    Java中利用反射(或spring)和多态来解决大量swich/case或者if/else的方法

    文章目录背景方案枚举接口实现多态总结 背景 工作中经常会有一些swich case或者if else的情况。一般这种情况一开始可能只有几个,但是几次迭代之后可能就会有非常多。...这个问题不难,关键解决方案就是多态+反射。多

    moshi-sealed,通过moshi多态适配器序列化kotlin密封类的反射和代码生成实现。.zip

    **密封类(Sealed Classes)**是Kotlin编程语言中的一种特性,用于限制类的继承。它们主要用于表示有限的、...了解并掌握`moshi-sealed`的使用,可以提升Kotlin项目中JSON序列化的能力,特别是在处理多态数据结构时。

    Java多态调用唯一性确定.pdf

    本文旨在解决Java多态调用唯一性确定问题,通过使用Soot开源工具和Java的反射机制,分析Java程序多态调用关系,确定函数调用路径,指导测试人员设计出高效、覆盖率高的测试用例。 Java多态性是面向对象语言中一个...

    一个例子让你了解Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许...每个demo都应该设计为解决一个特定的问题,例如如何动态调用私有方法,如何通过反射实现多态等。在实践中学习,你会更好地理解Java反射机制的威力和应用场景。

    对象转型和多态1

    3. **getClass()方法**:返回对象的运行时类,可以用来获取对象所属的类信息,常用于反射机制。 ```java Object obj = new Object(); Class<?> clazz = obj.getClass(); // 获取Object类 ``` 4. **toString()...

    java反射机制工具类

    1. 动态类型检查:反射可以在运行时检查对象的实际类型,这在多态编程和泛型中非常有用。 2. 调用私有方法和访问私有字段:通过反射,开发者可以绕过封装性,直接访问和修改私有成员,尽管这通常不推荐,但在某些...

    关于As3反射的问题

    7. **Interface Support**:AS3反射也允许在运行时检查对象是否实现了特定接口,这在多态和设计模式中很常见。 使用反射时需要注意的事项: 1. **性能影响**:反射操作通常比直接的静态调用慢,因为它们涉及运行时...

    .NET中的反射机制

    反射允许检查一个类型是否实现了特定的接口,这在多态设计中非常有用。`Type.IsAssignableFrom()`方法可以判断一个类型是否可以赋值给另一个类型,从而确定接口实现关系。 7. **委托与事件**: 反射可以用于动态...

    c# 反射源码(接口)

    本文将深入探讨如何使用C#中的反射与接口进行交互,以及如何动态调用DLL中的接口方法。 首先,让我们理解什么是反射。反射是.NET框架提供的一种能力,允许代码在运行时获取关于自身的信息,并且能够动态地创建类型...

    自己写Struts3

    看懂这个你需要具备以下技能:对java反射和多态的理解,熟悉Dom4j的XML的操作,一点点设计模式思想,至少知道单子模式,Properties有了解.基本上struts的功能都有,有兴趣你可以扩展,比如异常处理,action优化。运行...

    C++反射机制

    6. **映射表(Mapping Table)**:通过创建一个映射表,将类名(字符串)与类信息(如构造函数指针)关联起来,可以实现基于字符串的类实例化。映射表可以用模板和运行时查找来构建。 7. **编译时反射(Compile-...

    VB 2010 (20)多态性源码.rar

    实现多态性行为的方法有以下几种:后期绑定,,多接口,反射,继承.后期绑定实际上是以降低性能和编程的便利性为代价来实现纯多态性的。通过多接口和继承实现多态性,性能更好,编程也更容易。通过反射,我们既可以使用...

    kotlin反射方法教程文档kotlin反射方法教程文档

    2. **实现多态**:反射方法可以用于实现多态,即一个接口或基类的方法可以根据不同的子类实现来执行不同的操作。 3. **动态创建对象**:可以在运行时动态创建对象,这在处理未知类型的对象时非常有用。 4. **调用...

    反射学习笔记含代码

    ### 六、接口与多态的体现 通过反射,我们可以更灵活地处理继承和多态。例如,在`EveningParty`类中,我们可以通过反射动态创建并调用实现特定接口的不同子类的方法。 ### 七、工厂模式与配置文件的应用 通过反射...

    4.10 python 面向对象编程(类、对象、实例、继承、多态、封装、super()、类的装饰器、反射、内置魔术方法) 学习笔记

    1. **类与实例化** - 类创建时,会为类分配一个独立的命名空间,存储类中的所有名称。 - 实例化一个类,例如`ClassName()`,会开辟新的内存空间,调用`__init__`方法,将该内存空间的地址作为`self`传入,用于初始...

Global site tag (gtag.js) - Google Analytics