关于Java反射机制的几个问题

如何在运行时确定对象类型

运行时类型识别(Run-time Type Identification, RTTI)主要有两种方式,

一种是在编译时和运行时已经知道了所有的类型,另外一种是反射机制。

类型信息在运行时是如何表示的,是由Class对象完成的,它包含了与类有关的信息。
类是程序的重要组成部分,每个类都有一个Class对象,每当编写并编译了一个新类就会产生一个Class对象,它被保存在一个同名的.class文件中。
在运行时,当我们想生成这个类的对象时,运行这个程序的Java虚拟机(JVM)会确认这个类的Class对象是否已经加载,
如果尚未加载,JVM就会根据类名查找.class文件,并将其载入,一旦这个类的Class对象被载入内存,它就被用来创建这个类的所有对象。

一般的RTTI形式包括三种:
(1)通过传统的类型转换是否成功判断

如“(Apple)Fruit”,由RTTI确保类型转换的正确性,如果执行了一个错误的类型转换,就会抛出一个ClassCastException异常。

(2)通过Class对象来获取对象的类型


1

2

Class c = Class.forName(“Apple”);

Object o = c.newInstance();

 

(3)通过关键字instanceof或Class.isInstance()方法来确定对象是否属于某个特定类型的实例
准确的说,应该是instanceof / Class.isInstance()可以用来确定对象是否属于某个特定类及其所有父类的实例,
注意和equals() / ==区分,它们用来比较两个对象是否属于同一个类的实例,没有考虑继承关系。

Class下的newInstance()和new()有什么区别

首先,newInstance( )是一个方法,而new是一个关键字,
其次,Class下的newInstance()的使用有局限,因为它生成对象只能调用无参的构造函数,而使用new关键字生成对象没有这个限制。
总结如下:
Class.forName("")返回的是类;
Class.forName("").newInstance()返回的是Object。


理解Class.forName()方法

一般来说,使用Class.forName( )静态方法的目的是为了动态加载类,
在加载完成后,一般还要调用Class下的newInstance( )静态方法来实例化对象以便操作。
因此,使用Class.forName( )最终目的是为了实例化对象。

 

时间: 2024-12-02 04:37:37

关于Java反射机制的几个问题的相关文章

Java反射机制:包括组成、结构和示例说明等内容

第1部分 Java 反射机制介绍 Java 反射机制.通俗来讲呢,就是在运行状态中,我们可以根据"类的部分已经的信息"来还原"类的全部的信息".这里"类的部分已经的信息",可以是"类名"或"类的对象"等信息."类的全部信息"就是指"类的属性,方法,继承关系和Annotation注解"等内容. 举个简单的例子:假设对于类ReflectionTest.java,我们知道的

java反射机制系列(二)例子

下面我以顾客买相机为例来说明Java反射机制的应用.例子中涉及的类和接口有: Camera接口:定义了takePhoto()方法. Camera01类:一种照相机的类型,实现Camera接口. Camera02类:另一种照相机的类型,实现Camera接口. Seller类:卖照相机. Customer类:买相机,有main方法. 所有类都放在com包里 程序如下: public interface Camera { //声明照相机必须可以拍照 public void takePhoto(); }

java 反射机制系列(一) 初识Java Reflection

Java 反射机制是指Java程序可以在执行期载入,探知,使用编译期间完全未知的classes.这句话可能有点难以理解,我们可以通过一个例子来看.在Java程序中我们经常会用到这样一条语句来创建一个对象.Date date = new Date();在这条语句中date的类型(Java.util.Date)在编译时 已经确定.那么,有没有办法使我们把对象类型的确定时间由编译转到运行,答案是肯定的.这就是Java反射机制所提供的便利.而且它不单单可以生成对象还可以获取Field,对Field设值,

使用Java反射机制确定基本数据类型属性

Java反射机制提供了一种强大的应用程序接口来帮助我们在运行时检测和执行对象上的操作.该机制允许程序员审视一个未知对象,并且获得它的属性,例如对象上的方法,JavaBean的属性以及继承关系等. Java中有两种类型的值,一种是类类型,它把对象的属性定义在一个类中.类类型是面向对象结构的基本组成部分.第二种类型的值是基本数据类型.反射类型通常用于类类型,但是,其实它也可以很方便应用到Java的基本类型上. Java中的基本类型继承自基于C的语法,其中包括boolean.byte.short.in

java 利用java反射机制动态加载类的简单实现_java

如下所示: ////////////////// Load.java package org.bromon.reflect; import java.util.ArrayList; import java.util.List; public class Load implements Operator { @Override public List<?> act(List<?> params) { // TODO Auto-generated method stub List<

Java 反射机制详解及实例代码_java

Java反射详解 本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解. 下面开始正文. [案例1]通过一个对象获得完整的包名和类名 package Reflect; /** * 通过一个对象获得完整的包名和类名 * */ class Demo{ //other codes... } class hello{ public static void main(String[] args) {

reflection的应用-java反射机制的小应用

问题描述 java反射机制的小应用 怎样自己写一个通用的BaseDao(利用反射写出通用的增.删.改.查的方法) 解决方案 去看下hibernate的源码

java反射机制 getreturntype是如何知道方法返回值类型的

问题描述 java反射机制 getreturntype是如何知道方法返回值类型的 各位大神,小弟有一事不明 我们有一个变量,就是方法名 java反射机制 getReturnType()是如何知道我要定义的这个方法的返回值类型. 它怎么知道我要的这个方法应该返回什么值?? 解决方案 java编译后的.class文件里面记录了类的全部信息,包括方法的返回值.参数.异常等.程序运行时,.class文件会被加载到运行时数据区,java反射 机制就是从类型信息中获取装载类解析后的详细信息的. 解决方案二:

java反射机制剖析(一)—简介

    由之前动态代理的学习再次接触到反射这个知识点,第二次接触了所以做了一些稍微深入的了解.那么,对于反射这部分的内容我打算分三篇博客来总结.本篇博客先对反射做一个大概的了解,包括反射有关的RTTI.定义的理解以及涉及到的其他知识的简介. 回顾     java之前我接触反射这个知识,是在大话设计中的抽象工厂模式里,通过反射+配置文件来优化抽象工厂提高其应对需求变更的灵活性.当时对于反射的认知仅仅是它是一种技术,一种实例化对象的技术,一种实例化对象不依赖于写死的代码的技术.简单的说就是,它是一

Java反射机制既然可以拿到class对象,知道其中方法为啥不直接使用对象调用方法?

问题描述 Java反射机制既然可以拿到class对象,知道其中方法为啥不直接使用对象调用方法? Java反射机制既然可以拿到class对象,知道其中方法为啥不直接使用对象调用方法?而要invoke来调用对象的方法? 解决方案 知道方法的话当然可以不用invoke.需要invoke的方法大多是在写代码的时候无法确定的 解决方案二: 问题出现的场景是什么? 解决方案三: 面向接口,有些包是不同厂商实现的 反射能通过编译,在运行时才报错 解决方案四: 没有你想的那么简单,你多看看java的设计模式,和