反射机制最重要的部分是准许你检查类的结构。java.lang.reflect包中的三个类Field、Method、Constructor相应的描述了一个类的字段、方法、构造函数。使用这些类的时候必须要遵循下面步骤:
第一步是获得你想操作的类的 java.lang.Class 对象。下面就是获得一个 Class 对象的方法之一:Class c = Class.forName("java.lang.String"); //这条语句得到一个 String 类的类对象。还有另一种方法:Class c = int.class; 或者Class c = Integer.TYPE; //可获得基本类型的类信息。
第二步是调用诸如 getDeclaredMethods 的方法,以取得该类中定义的所有方法的列表。
Method m[] = c.getDeclaredMethods();
System.out.println(m[0].toString()); //以文本方式打印出 String 中定义的第一个方法的原型。
Class.forName 的作用 ? 为什么要用 ?
答: Class是运行中的class类,forName(className)是将这个名为className的类装入JVM,这样就可以动态的加载类,通过Class的反射机制可以获得此类的一些信息。Class.forName 的作用动态加载和创建Class 对象。
类加载器是用来加载.class文件,读取.class文件的字节码并加载到内存中。
关于类的初始化(执行static程序段):
1、A a = new A();//在类加载的时候即进行初始化
2、Class.forName(A);//在类加载(载入class)的时候即进行初始化
3、Class.forName(A,false,classLoader);//在newInstance的时候进行初始化
4、classLoader.loadClass(A);//在newInstance的时候进行初始化
static块仅执行一次
(1) 使用Class.forName()
+- public static Class forName(String className)
+- public static Class forName(String className, boolean initialize,ClassLoader loader)
参数说明:
className - 所需类的完全限定名(包括全路径)
initialize - 是否必须初始化类(静态代码块的初始化)
loader - 用于加载类的类加载器
不管使用的是new 來实例化某个类、或是使用只有一个参数的Class.forName()方法,内部都隐含了“载入类+运行静态代码块”的步骤。而使用具有三个参数的Class.forName()方法时,如果第二个参数为false,那么类加载器只会加载类,而不会初始化静态代码块,只有当实例化这个类的时候,静态代码块才会被初始化,静态代码块是在类第一次实例化的时候才初始化的。
Class类和对象
类是程序的一部分,每个类都有一个Class对象。换言之,每次写一个新类时,同时也会创建一个Class对象(更恰当地说,是保存在一个完全同名的.class文件中)。在运行期,一旦我们想生成这个类的对象,运行这个程序的Java虚拟机(JVM)首先就会检查这个类的Class对象是否已经载入。若尚未载入,JVM就会根据类名查找.class文件,并将其载入。所以Java程序并不是一开始就被完全加载的,这一点与许多传统语言都不同。
一旦某个类的Class对象被载入内存,它就被用来创建这个类的所有对象。注意:Class对象仅在需要的时候才被加载。Class类没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的,因此不能显式地声明一个Class对象。
基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也都对应一个 Class 对象。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。
有三种方法可以获取Class的对象:
1、调用Object类的getClass()方法来得到Class对象。例如:
MyObject x; Class c1 = x.getClass();
2、使用Class类的中静态forName()方法获得与字符串对应的Class对象。例如:
Class c2=Class.forName("MyObject");//MyObject必须是接口或者类的名字。
3、如果T是一个Java类型,那么T.class就代表了匹配的类对象。例如
Class cl1 = Manager.class; Class cl2 = int.class; Class cl3 = Double[].class;
注意:Class对象实际上描述的只是类型,而这类型未必是类或者接口。例如上面的int.class是一个Class类型的对象。
二、Class类的常用方法
1、getName() 以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
2、newInstance() 为类创建一个实例。例如: x.getClass.newInstance()。newInstance()方法调用默认构造器(无参数构造器)初始化新建对象。
3、getClassLoader() 返回该类的类加载器。
4、getSuperclass() 返回表示此 Class 所表示的实体的超类的 Class。
5、isArray() 判定此 Class 对象是否表示一个数组类。
三、Class的一些使用技巧
1、forName和newInstance结合起来使用,可以根据存储在字符串中的类名创建对象。例如 Object obj = Class.forName(s).newInstance();
2、虚拟机为每种类型管理一个独一无二的Class对象。因此可以使用==操作符来比较类对象。例如: if(e.getClass() == Employee.class)...
java classLoader原理
Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。类装载器是用来把类 (class) 装载进 JVM 的。JVM 规范定义了两种类型的类装载器:启动内装载器 (bootstrap) 和用户自定义装载器。
bootstrap 是 JVM 自带的类装载器,用来装载核心类库,如 java.lang.* 。java.lang.Object 是由 bootstrap 装载的。Java 提供了抽象类 ClassLoader ,所有用户自定义类装载器都实例化自 ClassLoader 的子类。
System Class Loader 是一个特殊的用户自定义类装载器,由 JVM 的实现者提供,在编程者不特别指定装载器的情况下默认装载用户类。系统类装载器可以通过 ClassLoader.getSystemClassLoader() 方法得到。
类装载器把一个类装入 Java 虚拟机中,要经过三个步骤:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:
(1)装载:寻找一个类或是一个接口的二进制形式并用该二进制形式来构造代表这个类或是这个接口的class 对象的过程。
(2)链接:就是把class类型数据合并到JVM得运行时状态中去。执行校验、准备和解析步骤;
校验:检查导入类或接口的二进制数据的正确性;准备:给类的静态变量分配并初始化存储空间;解析:将符号引用转成直接引用;
(3)初始化:初始化 Java 代码和静态 Java 代码块。初始化在JVM第一次主动使用该类型时进行的。所谓主动使用包括以下几种情况:
[1]创建类的新实例时(new指令或通过不明确的创建,反射,克隆或反序列化)
[2]调用类的静态方法时
[3]使用类的静态字段,或对该字段赋值时(final修饰的静态字段除外)
[4]初始化某个类的子类时
[5]JVM启动时某个被标明为启动类的类即含有main()方法的类
数组类的 Class 对象不是由类装载器创建的,而是由 Java 运行时根据需要自动创建。数组类的类装载器由 Class.getClassLoader()返回,该装载器与其元素类型的类装载器是相同的;如果该元素类型是基本类型,则该数组类没有类装载器。
虚拟机加载类的途径:
1、Dog dog = new Dog();
2、Class clazz = Class.forName(“Dog”);
Object dog =clazz.newInstance();
3、Class clazz = classLoader.loadClass(“Dog”);
Object dog =clazz.newInstance();
那么,1和2和3究竟有什么区别呢?分别用于什么情况呢?
1和2使用的类加载器是相同的,都是当前类加载器。(即:this.getClass.getClassLoader)。
3由用户指定类加载器。如果需要在当前类路径以外寻找类,则只能采用第3种方式。第3种方式加载的类与当前类分属不同的命名空间。
另外,第1种和第2种都会导致执行类的静态初始化语句,而第3种情况不会。另外第1种抛出Error,第2、3种抛出Exception,它们分属于不同的异常/错误分支。
相关推荐
Java发射技术,主要指的是Java反射(Reflection)机制,它是Java编程语言中的一种强大的工具,允许程序在运行时检查和操作类、接口、字段以及方法等信息。反射在Java中扮演着重要的角色,尤其是在动态类型语言的支持...
Java发射机制,也称为反射机制,是Java编程语言的一个强大特性,它允许程序在运行时检查和操作类、接口、字段以及方法等对象。通过反射,开发者能够在不知道具体类名的情况下,动态地创建对象并调用其方法。这种能力...
Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在本篇文章中,我们将探讨Java反射的基本概念、如何使用以及其在实际开发中的应用,结合“JAVA简单...
"main补丁"可能是指一种解决这个问题的方法,即通过修改或增强Eclipse的Java发射器(Java Launcher)组件来缩短或优化类路径。在提供的压缩包子文件中,我们看到两个与Eclipse Java发射器相关的jar文件: 1. `org....
4. 用户交互:使用键盘监听器(`KeyListener`)或鼠标监听器(`MouseListener`)处理用户的输入,如控制飞机移动、发射子弹等。 5. 多线程:为了保持游戏流畅,通常会将游戏逻辑与GUI更新放在不同的线程中执行,避免...
"基于JAVA的发射角计算工具的研究与开发" 本文研究和开发了一款基于JAVA的发射角计算工具,以满足实际工作需求。该工具使用JAVA语言开发,具有易于学习和使用的特点,能极大地提高工作效率。 知识点1:JAVA语言...
对于水下发射模拟来说,Java3D技术提供了一个高效、直观的工具,帮助军事研究和开发人员在复杂的水下环境中模拟航行体的发射过程,对提高发射效率、准确性和安全性有着重要意义。随着技术的不断进步,Java3D的性能也...
在这个飞机游戏中,Java的面向对象特性被充分利用,飞机、子弹和敌机等游戏元素都可以被设计为独立的对象,具有各自的属性(如位置、速度)和行为(如移动、发射子弹)。 线程是Java中的重要概念,它允许多个任务在...
"用于Java的微型事件发射器库",即Eemit,是一个轻量级的Java库,专门设计用于帮助开发者在他们的应用程序中实现事件发布和订阅机制。Eemit库简化了事件处理过程,使得代码更加模块化,易于维护。 Eemit的核心概念...
在"Java3D虚拟现实技术在水下发射模拟中的应用"这一主题中,我们将深入探讨如何利用这项技术来构建逼真的水下环境,模拟水下发射过程,如潜艇导弹发射等复杂操作。 Java3D是Java平台上的一个高级图形库,它提供了...
坦克大战Java源代码使用了多线程编程技术,使用Thread类来实现坦克的移动和子弹的发射。坦克的移动和子弹的发射都是在不同的线程中执行的,从而实现了游戏的并发执行。 面向对象编程 坦克大战Java源代码使用了面向...
其次,**发射子弹**涉及对象的创建和运动。当玩家按下特定键时,会创建一个新的子弹对象,并赋予其初始位置和速度。之后,每帧都会更新子弹的位置,直到它离开屏幕或与目标发生碰撞。 **跳跃**功能是通过控制马里奥...
捕鱼达人源码会展示如何设计游戏循环,处理游戏的开始、暂停、结束等不同状态,以及玩家发射炮弹、得分、升级等事件。这需要对面向对象编程有深入理解,如何合理地设计类和接口,以及如何利用事件驱动模型来响应用户...
【超级马里奥Java版 代码】是一款基于Java编程语言实现的经典游戏——超级马里奥的源代码。对于想要学习游戏开发,特别是Java游戏编程的初学者来说,这是一个极好的学习资源。通过研究这个项目,你可以了解到游戏...
1. 游戏对象的创建:在Java中,游戏中的飞机、子弹、敌机等都可抽象为类,每个类包含其特有的属性(如位置、速度、生命值)和行为(如移动、发射子弹、碰撞检测)。这些类的实例就是游戏中的对象,它们之间的交互...
- **事件处理**:游戏中的用户交互,如点击弹弓发射小鸟,需要监听键盘或鼠标事件,Java的AWT和Swing库提供了丰富的事件处理机制。 - **多线程**:游戏的运行通常需要一个独立的线程来处理图形更新,以保持流畅性...
在Java编程语言中,"java小球45°来回弹"是一个常见的计算机图形学和游戏编程练习,它涉及到物体运动的模拟、碰撞检测以及角度计算等知识点。下面将详细讲解这些概念及其应用。 首先,我们需要创建一个表示小球的类...
Java编程是IT领域中最受欢迎的编程语言之一,尤其在企业级应用和桌面应用程序开发中有着广泛的应用。本项目是一个基于Java编写的弹球小游戏,它为初学者提供了一个实际操作和学习Java语言的良好平台。下面将详细介绍...
游戏开发中的Java应用通常基于Java虚拟机(JVM),这使得Java程序可以在任何安装了JVM的系统上运行。此外,Java提供丰富的类库,如Swing和JavaFX,用于创建图形用户界面,这对于游戏开发来说非常关键。 【游戏架构...