java反射初学整理

来源:互联网 发布:支教如何报名 知乎 编辑:程序博客网 时间:2024/05/21 14:54
1.什么是反射

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

Java反射机制主要提供了以下功能:在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

延伸方向:动态语言

一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。

尽管在这样的定义与分类下Java不是动态语言,它却有着一个非常突出的动态相关机制:Reflection。这个字的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。这种“看透class”的能力(theability of the program to examineitself)被称为introspection(内省、内观、反省)。Reflection和introspection是常被并提的两个术语。

2.Class类

可以说,没有Class类就没有反射。

而只有获取了Class对象,才可以对其拥有的成员进行操作。

Class类十分特殊。它和一般类一样继承自Object,其实体用以表达Java程序运行时的classes和interfaces,也用来表达enum、array、primitiveJava types(boolean, byte, char, short, int, long, float,double)以及关键词void。当一个class被加载,或当加载器(class loader)的defineClass()被JVM调用,JVM便自动产生一个Class 对象。如果您想借由“修改Java标准库源码”来观察Class对象的实际生成时机(例如在Class的constructor内添加一个println()),这样是行不通的!因为Class并没有publicconstructor。

3.获取Class对象的方式

a.Object是百类之主,其中定义了getClass()方法,顾名思义可知,该方法可用来Class对象。

b.对于Integer等数据类型,可以使用.Type语法和.class

c.一般类使用.class

d.Class.forName()乃是静态方法,也可以使用。

package xyz.waterloocode.www;public class ReflectDemo {//Person p1 = null;public static void main(String[] args) throws ClassNotFoundException {Person p1 =  Person.getPerson();Class c1 = p1.getClass();Class c2 = Integer.TYPE;Class c3 = Integer.class;Class c4 = Class.class;Class c6 = Person.class;Class c5 = Class.forName("xyz.waterloocode.www.Person");System.out.println(c2.getName()+"\n"+c1.getSimpleName());System.out.println(c4.getName());System.out.println(c6.getName());}public static  class Person {public  static Person getPerson(){Person p = new Person();return p;}public String run() {System.out.println("run and run!!!....");return "11.....";}public void car(){System.out.println("start.....");}}}



0 0
原创粉丝点击