这次主要学习java是如何在运行时识别对象和类的信息的。主要包括了两种方式:①RTTI(Run-Time Type Information)②反射。它们都可以使我们在运行时能够识别对象的类型信息。
首先我们应当知道类型信息在java中是如何表示的。我们可以看到一个java类进行编译时会产生一个同名的class文件,这里就保存着该java类对应的Class对象,Class对象可以用来创建其他的对象以及类的RTTI。所有的类在第一次被使用时都会被加载到JVM中,但我们需要注意的是Java程序在开始运行之前并不是被完全加载的而是动态加载的。获取Class对象有一下三种方法:
①Class.forName()
②类名.class
③对象.getClass()
其中③是在已经拥有到实际的对象,然后通过getClass()获取该类的Class对象的引用。
①和②都可以获取到Class对象但是又存在些许的区别,使用.class语法来获得对类的引用不会触发对类的初始化,而使用①就会立即触发对类的初始化。
可以通过下面的代码看出来:
class Initable { static final int staticFinal = 47; static final int staticFinal2 = ClassInitialization.rand.nextInt(1000); static { System.out.println("Initializing Initable"); } } class Initable2 { static int staticNonFinal = 147; static { System.out.println("Initializing Initable2"); } } class Initable3 { static int staticNonFinal = 74; static { System.out.println("Initializing Initable3"); } } public class ClassInitialization { public static Random rand = new Random(47); @SuppressWarnings({ "unused", "rawtypes" }) public static void main(String[] args) throws Exception { Class initable = Initable.class; System.out.println("After creating Initable ref"); System.out.println(Initable.staticFinal); System.out.println(Initable.staticFinal2); System.out.println(Initable2.staticNonFinal); Class initable3 = Class.forName("Initable3"); System.out.println("After creating Initable3 ref"); System.out.println(Initable3.staticNonFinal); } }
输出结果为:
After creating Initable ref
47
Initializing Initable
258
Initializing Initable2
147
Initializing Initable3
After creating Initable3 ref
74
在获取到Class对象以后我们就是通过Class对象的一些方法获取到更多的信息,例如getMehthod(),getConstructor()等。
②如果我们在编译时不知道获取对象的确切类型,此时我们可以使用反射。下面是一个动态代理的例子。
class MethodSelector implements InvocationHandler { private Object proxied; public MethodSelector(Object proxied) { this.proxied = proxied; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if(method.getName().equals("interesting")) System.out.println("Proxy detected the interesting method"); return method.invoke(proxied, args); } } interface SomeMethods { void boring1(); void boring2(); void interesting(String arg); void boring3(); } class Implementation implements SomeMethods { public void boring1() { System.out.println("boring1"); } public void boring2() { System.out.println("boring2"); } public void interesting(String arg) { System.out.println("interesting " + arg); } public void boring3() { System.out.println("boring3"); } } class SelectingMethods { public static void main(String[] args) { SomeMethods proxy= (SomeMethods)Proxy.newProxyInstance( SomeMethods.class.getClassLoader(), new Class[]{ SomeMethods.class }, new MethodSelector(new Implementation())); proxy.boring1(); proxy.boring2(); proxy.interesting("bonobo"); proxy.boring3(); } }
相关推荐
java基础数据类型。
Java基础是学习编程语言的重要阶段,对于初学者来说,掌握好这一阶段的知识是成为熟练Java开发者的基石。本文将深入探讨Java基础练习代码中的关键概念,帮助初学者巩固基础,提高编程技能。 首先,Java是一种面向...
本文将对《Java 基础入门》课后习题答案进行总结,涵盖了 Java 基础知识点,包括 Java 开发入门、Java 基础类、变量类型、运算符、控制流语句、方法重载等。 一、Java 开发入门 * Java EE、Java SE、Java ME 是 ...
资源名称:Java编程基础知识变量与数据类型资源目录:【】11957c6aed0bbd30e284837b53bc3a6f【】2.Java编程基础知识变量与数据类型1.数据类型初阶【】2.Java编程基础知识变量与数据类型10.浮点类型【】2.Java编程...
Java基础入门 本文档旨在为初学者提供Java基础知识的概述,涵盖了Java是什么、Java能做什么和Java怎样改变我的生活等问题的答案。 什么是Java? Java是一种高级程序语言,也是一个平台。它具有以下特征:简单、...
Java基础学习课件PPT是一套全面覆盖Java SE(标准版)基础知识的教育资源,适合初学者和希望巩固Java技能的开发者。这套课件旨在在一个月内帮助学习者掌握Java编程的核心概念,为深入学习和应用Java技术打下坚实的...
### Java基础教学知识点 #### 一、Java的基本语法规则 **1.1 基本数据类型** Java中提供了多种基本数据类型,包括整数类型(`byte`, `short`, `int`, `long`)、浮点数类型(`float`, `double`)、字符类型(`...
2. Java基础语法:包括程序的基本结构,如数据类型、变量、常量的定义与使用,以及基础的程序控制流程,如选择结构(if、switch)和循环结构(while、for、do-while)。 3. 注释、关键字与标识符:解释程序中注释的...
这份"java基础教程ppt"提供了一个全面的学习资源,帮助初学者掌握Java编程的基本概念和语法。 在Java的基础教程中,通常会包含以下几个核心知识点: 1. **Java简介**:介绍Java的历史、特点以及其在软件开发中的...
《Java基础入门(第3版)》是一本针对Java初学者的教材,其课后答案文档提供了对书中习题的解答,旨在帮助读者巩固所学知识。Java是一种面向对象的编程语言,具备跨平台性,由Java虚拟机(JVM)负责解释执行。Java...
这个"java基础课程之一"的资源包显然旨在帮助学习者构建坚实的Java编程基础。在这个课程中,你将接触到一系列关键知识点,包括但不限于: 1. **Java环境配置**:首先,你需要安装JDK(Java Development Kit),并...
这份“Java基础教程PPT”是为初学者设计的,旨在帮助他们掌握Java编程的基础概念和技能。 首先,PPT可能会从Java的历史和特性开始讲解。Java由James Gosling在1995年推出,目标是“一次编写,到处运行”。它的主要...
北京动力节点-Java编程零基础教程-070-Java基本语法-数据类型-String类型.avi 北京动力节点-Java编程零基础教程-071-Java基本语法-运算符-算术运算基本用法.avi 北京动力节点-Java编程零基础教程-072-Java基本...
Java基础总结大全涵盖了Java编程语言的核心概念,从JVM、JRE和JDK的区别,到环境变量的设置,再到变量的定义和类型转换,深入浅出地讲解了Java的基础知识。 1. JVM、JRE和JDK: - JVM(Java Virtual Machine)是...
学生信息管理系统(Java基础版-无数据库) 本篇文章将对学生信息管理系统的Java基础版进行详细的解释和分析,该系统不需要使用数据库技术,非常适合Java初学者作为练习项目。 Java基础 Java是一种高级语言,具有...
这份"Java基础PPT"涵盖了Java编程的基础知识,对于初学者或希望巩固基础知识的开发者来说是宝贵的资源。PPT的重复标题暗示内容可能深入且全面,旨在系统地讲解Java的核心概念。 在Java的基础学习中,首先会接触到的...
6. 反射与动态代理:17反射与动态代理.md探讨了Java的反射机制,允许在运行时获取类的信息并操作对象。动态代理则提供了一种在运行时创建代理对象的能力,常用于实现AOP(面向切面编程)。 通过阅读和理解这些笔记...
Java 语言基础类型循环控制是 Java 语言的核心组件之一,涉及到 Java 语言的发展史、JDK 的下载和安装、DOS 命令的介绍和使用、Path 环境变量的配置等重要知识点。 Java 语言的发展史可以追溯到 1990 年,当时 Sun ...