这次主要学习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编程基础知识变量与数据类型资源目录:【】11957c6aed0bbd30e284837b53bc3a6f【】2.Java编程基础知识变量与数据类型1.数据类型初阶【】2.Java编程基础知识变量与数据类型10.浮点类型【】2.Java编程...
北京动力节点-Java编程零基础教程-070-Java基本语法-数据类型-String类型.avi 北京动力节点-Java编程零基础教程-071-Java基本语法-运算符-算术运算基本用法.avi 北京动力节点-Java编程零基础教程-072-Java基本...
二、 Java语法基础 5 数据类型 5 运算符号 14 语句 15 函数 15 方法重载(Overloadjing)与重写(Overriding) 16 数组 17 总结 18 三、 常见关键字 20 四、 面向对象★★★★★ 21 五、 封装(面向对象特征之一)★...
完整版java基础入门教程由浅入深讲解 Java语言编程基础 第02章 java数据类型(共40页).ppt 完整版java基础入门教程由浅入深讲解 Java语言编程基础 第03章 运算符与表达式(共23页).ppt 完整版java基础入门教程...
最全的Java视频基础。 从环境变量配置, 到基本的HelloWorld编写 到Java的基本数据类型 到Java 集合总结 到java IO 到Java 多线程编程 到java Socket 编程 从简单到复杂,从不会到会,全程教你如何玩转Java,如何从...
java基础大全相信大家会用到的、JVM、JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性。 java语言是跨平台,jvm不是跨平台的。 JRE(Java Runtime Environment):java的运行...
JAVA中的关键字、标识符、注释 JAVA中的数据类型、变量、运算符、表达式 JAVA类中方法的调用
java 基础 JAVA的来由和发展历史 JDK的版本和安装 JAVA的两种程序类型的区别 (Application及Applet)及各自的编译执行步骤 JAVA源程序的组成 文件名的要求
Java_基础试题及答案 涵盖了JAVA基础试题及答案!
JAVA 语言基础 类型 循环控制
Java入门书籍,内容包括:Java 语言介绍,简单的 Java 程序,Java 中的变量与数据类型,运算符、表达式与语句,循环与选择结构,数组与方法的使用
java基础的数据类型 看这个思维导图就够了
Java基础:Java事务处理类型-差异总结.htm
Java中的简单类型从概念上分为四种:实数、整数、字符、布尔值。但是有一点需要说明的是,Java里面只有八种原始类型
SQL的数据类型与Java数据类型的对应关系,是程序员必备的基础知识,欢迎大家下载。
Java是一种强类型语言,这意味着在Java中,每个变量都必须先声明其数据类型,然后才能使用。Java的数据类型可以分为两类:基本数据类型和引用数据类型。基本数据类型包括byte、short、int、long、float、double和...
对java基础知识的总结;包括面向对象特性,java基础,数据类型,泛型,正则等。