`
lwbbupt
  • 浏览: 36337 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java基础之类型信息

阅读更多

       

         这次主要学习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();
  }
} 

 

 

 

 

  • 描述: reflect
  • 大小: 26.2 KB
2
0
分享到:
评论

相关推荐

    Java基础数据类型

    java基础数据类型。

    Java基础练习代码

    Java基础是学习编程语言的重要阶段,对于初学者来说,掌握好这一阶段的知识是成为熟练Java开发者的基石。本文将深入探讨Java基础练习代码中的关键概念,帮助初学者巩固基础,提高编程技能。 首先,Java是一种面向...

    《Java基础入门》-课后习题答案.doc

    本文将对《Java 基础入门》课后习题答案进行总结,涵盖了 Java 基础知识点,包括 Java 开发入门、Java 基础类、变量类型、运算符、控制流语句、方法重载等。 一、Java 开发入门 * Java EE、Java SE、Java ME 是 ...

    Java编程基础知识变量与数据类型

    资源名称:Java编程基础知识变量与数据类型资源目录:【】11957c6aed0bbd30e284837b53bc3a6f【】2.Java编程基础知识变量与数据类型1.数据类型初阶【】2.Java编程基础知识变量与数据类型10.浮点类型【】2.Java编程...

    Java基础入门.pdf

    Java基础入门 本文档旨在为初学者提供Java基础知识的概述,涵盖了Java是什么、Java能做什么和Java怎样改变我的生活等问题的答案。 什么是Java? Java是一种高级程序语言,也是一个平台。它具有以下特征:简单、...

    java基础教程(pdf)

    Java基础教程是初学者入门编程世界的一把钥匙,它涵盖了编程的基本概念以及Java语言的核心特性。这份PDF教程旨在提供一个全面而深入的学习路径,让你能够快速掌握Java编程的基础。 首先,我们从第1章“Java语言基础...

    java基础学习课件ppt

    Java基础学习课件PPT是一套全面覆盖Java SE(标准版)基础知识的教育资源,适合初学者和希望巩固Java技能的开发者。这套课件旨在在一个月内帮助学习者掌握Java编程的核心概念,为深入学习和应用Java技术打下坚实的...

    Java.doc (java基础教学)

    ### Java基础教学知识点 #### 一、Java的基本语法规则 **1.1 基本数据类型** Java中提供了多种基本数据类型,包括整数类型(`byte`, `short`, `int`, `long`)、浮点数类型(`float`, `double`)、字符类型(`...

    java基础资料大全

    2. Java基础语法:包括程序的基本结构,如数据类型、变量、常量的定义与使用,以及基础的程序控制流程,如选择结构(if、switch)和循环结构(while、for、do-while)。 3. 注释、关键字与标识符:解释程序中注释的...

    java基础教程ppt

    这份"java基础教程ppt"提供了一个全面的学习资源,帮助初学者掌握Java编程的基本概念和语法。 在Java的基础教程中,通常会包含以下几个核心知识点: 1. **Java简介**:介绍Java的历史、特点以及其在软件开发中的...

    《Java基础入门(第3版)》(Java):课后答案-docx文档

    《Java基础入门(第3版)》是一本针对Java初学者的教材,其课后答案文档提供了对书中习题的解答,旨在帮助读者巩固所学知识。Java是一种面向对象的编程语言,具备跨平台性,由Java虚拟机(JVM)负责解释执行。Java...

    java基础课程之一

    这个"java基础课程之一"的资源包显然旨在帮助学习者构建坚实的Java编程基础。在这个课程中,你将接触到一系列关键知识点,包括但不限于: 1. **Java环境配置**:首先,你需要安装JDK(Java Development Kit),并...

    Java基础教程PPT

    这份“Java基础教程PPT”是为初学者设计的,旨在帮助他们掌握Java编程的基础概念和技能。 首先,PPT可能会从Java的历史和特性开始讲解。Java由James Gosling在1995年推出,目标是“一次编写,到处运行”。它的主要...

    125集专攻JAVA基础 JAVA零基础入门学习视频教程 动力节点JAVA视频教程.txt

    北京动力节点-Java编程零基础教程-070-Java基本语法-数据类型-String类型.avi 北京动力节点-Java编程零基础教程-071-Java基本语法-运算符-算术运算基本用法.avi 北京动力节点-Java编程零基础教程-072-Java基本...

    java基础总结大全(笔记).pdf

    Java基础总结大全涵盖了Java编程语言的核心概念,从JVM、JRE和JDK的区别,到环境变量的设置,再到变量的定义和类型转换,深入浅出地讲解了Java的基础知识。 1. JVM、JRE和JDK: - JVM(Java Virtual Machine)是...

    学生信息管理系统(Java基础版-无数据库)

    学生信息管理系统(Java基础版-无数据库) 本篇文章将对学生信息管理系统的Java基础版进行详细的解释和分析,该系统不需要使用数据库技术,非常适合Java初学者作为练习项目。 Java基础 Java是一种高级语言,具有...

    java基础PPTJava基础PPT

    这份"Java基础PPT"涵盖了Java编程的基础知识,对于初学者或希望巩固基础知识的开发者来说是宝贵的资源。PPT的重复标题暗示内容可能深入且全面,旨在系统地讲解Java的核心概念。 在Java的基础学习中,首先会接触到的...

    Java基础 学习笔记 Markdownr版

    6. 反射与动态代理:17反射与动态代理.md探讨了Java的反射机制,允许在运行时获取类的信息并操作对象。动态代理则提供了一种在运行时创建代理对象的能力,常用于实现AOP(面向切面编程)。 通过阅读和理解这些笔记...

Global site tag (gtag.js) - Google Analytics