- 浏览: 238209 次
- 性别:
- 来自: 常州
文章分类
- 全部博客 (165)
- Java基础 (49)
- 开发工具 (3)
- Python基础 (1)
- Oracle基础 (9)
- Java 符号计算 (0)
- 计算机基本原理 (10)
- SQL (6)
- javascript (16)
- HTML (2)
- XML (4)
- 程序员之路 (7)
- JDBC (1)
- Unicode (0)
- 字符编码 (3)
- JSP基础 (2)
- Servlet&JSP (9)
- MySQL基础 (1)
- UML基础 (1)
- Hibernate (2)
- Java包 (1)
- Spring (1)
- Struts2 (9)
- 系统命令 (1)
- Tomcat (1)
- Windows (1)
- Android (1)
- C#基础 (14)
- HTML5 (1)
- .NET基础 (1)
- 数据库基础 (2)
- ASP.NET基础 (7)
- 开源Java (3)
- 趣味算法 (1)
- 面向对象思想 (1)
- 软件应用 (1)
- Web工程 (1)
- jquery (2)
- JPA (0)
- 设计模式 (0)
最新评论
-
静夜独窗:
JavaBean组件能说的具体一点吗,我感觉这样说理解的不清晰 ...
EL 表达式语言 -
静夜独窗:
在Java中,不同字符集编码的转换是通过Unicode作为中介 ...
JavaWeb中的乱码产生与解决方案
先自定义一对父类与子类
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对象所对应的类。"); } }
发表评论
-
Java NIO 基础学习
2013-09-21 16:24 939零、概述 1、传统IO的问题 2、非阻塞IO ... -
try finally 与 return
2013-09-02 16:11 9601、try、catch、finally语句中,在如果try ... -
Java的传值
2013-07-21 13:06 951这个问题一直以来都有误区。本质原因是那些写书的人,喜欢用“传 ... -
Java多线程——synchronized的问题
2013-06-14 15:51 1043一直以来都存在这样的问题: 多线程操作同一对象。该对象有 ... -
Java与操作系统的交互
2013-05-05 22:08 1707System类 System表示Java程序的运行平台。S ... -
java枚举
2013-04-06 15:59 900枚举,之前一直忽视了其存在。其实挺有用。 java5 ... -
Java语法细节
2013-02-03 11:19 925final关键字 final修饰的量以视为常量,当fin ... -
Java Socket 学习笔记
2013-01-29 23:42 958Socket:英文中的意思是插座。 两个Java应用程序 ... -
Java 线程同步
2013-01-27 23:17 1035理解Java线程状态: ... -
Java 与 C# 计算性能比较
2012-11-02 14:51 1160程序:寻找2亿以内的最大素数,从2开始寻找。 Java程序: ... -
Java数组的操作
2012-10-12 11:23 849一、复制数组 java.lang.System类中的静态 ... -
Java容器
2012-10-09 00:33 884Java集合类就像容器。把多个对象的引用放进容器中。即集合类主 ... -
Java日期处理
2013-01-31 23:05 859不得不吐槽一下Java的日期处理。太不爽了。 基本 ... -
java:Excel
2012-09-27 09:06 1124jxl操作excel 在开源世界中,有两套比较有影响的API ... -
关于分页显示的页码
2012-08-21 13:30 1269分页显示数据时常常需要将页码列出来。 此处的Page类主要关 ... -
dom4j
2012-07-07 17:21 2241dom4j 与JDOM一样,也是一种用于解析XML文档 ... -
JDOM基础
2012-07-07 17:20 1945JDOM Java Document Object Mode ... -
线程优先级 && 后台线程 && join线程
2012-07-02 23:08 46线程优先级 每个线 ... -
Java线程的运行状态(线程的生命周期)
2012-07-02 22:56 900新建和就绪 ... -
Java多线程 Thread类 和 Runnable接口
2012-07-02 22:13 1520Java的线程,即一个Thre ...
相关推荐
6. 反射与多态的结合:反射可以在运行时动态地识别和调用多态方法。例如,可以使用反射来获取对象的类型信息,然后根据其实际类型动态调用适当的方法。这在处理未知类型的对象或实现通用算法时特别有用。 总结来说...
该项目是一个专注于Java编程基础学习的源码集,涵盖JDK接口、多态、继承、封装与反射等核心概念。源码集包含43个文件,其中Java源文件22个,CSS样式文件7个,以及HTML、下载链接、文档和其他辅助文件。通过这个源码...
文章还包括了一些进阶技巧,如接口与抽象类的区别与使用、动态绑定与静态绑定、Java反射与Lambda表达式的结合等。并给出了最佳实践建议。 适合人群:具备一定Java编程基础的开发者。 使用场景及目标:适用于初学者和...
此外,多态与重载的混合使用在面试中经常出现。例如,类`A`中定义了两个`show`方法,分别接受`D`和`A`类型的参数,而类`B`继承自`A`并重写了`show(D)`方法。此时,如果有一个`B`类型的对象`b`,并使用`A`类型的引用...
文章目录背景方案枚举接口实现多态总结 背景 工作中经常会有一些swich case或者if else的情况。一般这种情况一开始可能只有几个,但是几次迭代之后可能就会有非常多。...这个问题不难,关键解决方案就是多态+反射。多
**密封类(Sealed Classes)**是Kotlin编程语言中的一种特性,用于限制类的继承。它们主要用于表示有限的、...了解并掌握`moshi-sealed`的使用,可以提升Kotlin项目中JSON序列化的能力,特别是在处理多态数据结构时。
本文旨在解决Java多态调用唯一性确定问题,通过使用Soot开源工具和Java的反射机制,分析Java程序多态调用关系,确定函数调用路径,指导测试人员设计出高效、覆盖率高的测试用例。 Java多态性是面向对象语言中一个...
Java反射机制是Java编程语言中的一个重要特性,它允许...每个demo都应该设计为解决一个特定的问题,例如如何动态调用私有方法,如何通过反射实现多态等。在实践中学习,你会更好地理解Java反射机制的威力和应用场景。
3. **getClass()方法**:返回对象的运行时类,可以用来获取对象所属的类信息,常用于反射机制。 ```java Object obj = new Object(); Class<?> clazz = obj.getClass(); // 获取Object类 ``` 4. **toString()...
1. 动态类型检查:反射可以在运行时检查对象的实际类型,这在多态编程和泛型中非常有用。 2. 调用私有方法和访问私有字段:通过反射,开发者可以绕过封装性,直接访问和修改私有成员,尽管这通常不推荐,但在某些...
7. **Interface Support**:AS3反射也允许在运行时检查对象是否实现了特定接口,这在多态和设计模式中很常见。 使用反射时需要注意的事项: 1. **性能影响**:反射操作通常比直接的静态调用慢,因为它们涉及运行时...
反射允许检查一个类型是否实现了特定的接口,这在多态设计中非常有用。`Type.IsAssignableFrom()`方法可以判断一个类型是否可以赋值给另一个类型,从而确定接口实现关系。 7. **委托与事件**: 反射可以用于动态...
本文将深入探讨如何使用C#中的反射与接口进行交互,以及如何动态调用DLL中的接口方法。 首先,让我们理解什么是反射。反射是.NET框架提供的一种能力,允许代码在运行时获取关于自身的信息,并且能够动态地创建类型...
看懂这个你需要具备以下技能:对java反射和多态的理解,熟悉Dom4j的XML的操作,一点点设计模式思想,至少知道单子模式,Properties有了解.基本上struts的功能都有,有兴趣你可以扩展,比如异常处理,action优化。运行...
6. **映射表(Mapping Table)**:通过创建一个映射表,将类名(字符串)与类信息(如构造函数指针)关联起来,可以实现基于字符串的类实例化。映射表可以用模板和运行时查找来构建。 7. **编译时反射(Compile-...
实现多态性行为的方法有以下几种:后期绑定,,多接口,反射,继承.后期绑定实际上是以降低性能和编程的便利性为代价来实现纯多态性的。通过多接口和继承实现多态性,性能更好,编程也更容易。通过反射,我们既可以使用...
2. **实现多态**:反射方法可以用于实现多态,即一个接口或基类的方法可以根据不同的子类实现来执行不同的操作。 3. **动态创建对象**:可以在运行时动态创建对象,这在处理未知类型的对象时非常有用。 4. **调用...
### 六、接口与多态的体现 通过反射,我们可以更灵活地处理继承和多态。例如,在`EveningParty`类中,我们可以通过反射动态创建并调用实现特定接口的不同子类的方法。 ### 七、工厂模式与配置文件的应用 通过反射...
1. **类与实例化** - 类创建时,会为类分配一个独立的命名空间,存储类中的所有名称。 - 实例化一个类,例如`ClassName()`,会开辟新的内存空间,调用`__init__`方法,将该内存空间的地址作为`self`传入,用于初始...