java语言反射机制

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在java.lang.Object类中定义了getClass()方法,因此对于 任意一个Java对象,都可以通过此方法获得对象的类型。 Class类是Reflection API中的核心类,它有以下方法。 getName():获得类的完整名字。 getFields():获得类的public类型的属性。 getDeclaredFields():获得类的所有属性。 getMethods():获得类的public类型的方法。 getDeclaredMethods() getDeclaredMethods():获得类的所有方法。 getMethod(String name, Class[] parameterTypes):获 得类的特定方法,name参数指定方法的名字, parameterTypes参数指定方法的参数类型。 getConstrutors():获得类的public类型的构造方法。 getConstrutor(Class[] parameterTypes):获得类的特定 构造方法,parameterTypes参数指定构造方法的参数类 型。 newInstance():通过类的不带参数的构造方法创建这 个类的一个对象。
7.程序的输出结果 class Base { Base() {System.out.println(“this base”)} } class Sub extends Base { Sub() {System.out.println(“this sub”)} } class Sub2 extends Base {} public class cex{ public static void main(String argv[]){ Sub b = new Sub(); }}
class Base {Base(){ System.out.println("this Base");}} class Sub extends Base { Sub(){System.out.println("this Sub"); } } class Sub2 extends Sub {Sub2() {System.out.println("this Sub2"); } } public class cex{ public static void main(String argv[]){ Sub2 b = new Sub2(); }}
1.错。Abstract 方法 必须以分号结尾, 且不带括号 2.错。局部变量前不能放置任何访问修符 (private,public protected) final可以用来修饰局部变量。 3. Short s1=1;s1=s1+1;(s1+1的运算结果是 int型,需要强制转化) Short s1=1;s1+=1;(可以正确编译) 4.5.6.Java中父类不能强制转化为子类。 子类能强制转化为父类。
Java如何能够做出上述的动态特性呢? 这是一个深远话题,本文对此只简单介绍 一些概念。整个篇幅最主要还是介绍 Reflection APIs,也就是让读者知道如何探 索class的结构、如何对某个“运行时才获 知名称的class”生成一份实体、为其fields设 值、调用其methods。本文将谈到 java.lang.Class,以及java.lang.reflect中的 Method、Field、Constructor等等classes。
(2)通过默认构造方法创建一个新的对象: Object objectCopy=classType.getConstructor(new Class[]{}).newInstance(new Object[]{}); 以上代码先调用Class类的getConstructor()方法获得一个 Constructor对象,它代表默认的构造方法,然后调用 Constructor对象的newInstance()方法构造一个实例。 (3)获得对象的所有属性: Field fields[]=classType.getDeclaredFields(); Class类的getDeclaredFields()方法返回类的所有属性,包括 public、protected、默认和private访问级别的属性。 (4)获得每个属性相应的getXXX()和setXXX()方法,然后 执行这些方法,把原来对象的属性复制到新的对象中:
class Base {Base(){System.out.println("this Base");} Base(String s){System.out.println(s);}} class Sub extends Base { Sub(){ super(“java"); System.out.println("this Sub"); }} public class cex{ public static void main(String argv[]){ Sub b = new Sub(); }}
如例程10-2所示ReflectTester类进一步演示了 Reflection API的基本使用方法。ReflectTester类 有一个copy(Object object)方法,这个方法能够创 建一个和参数object同样类型的对象,然后把 object对象中的所有属性复制到新建的对象中, 并将它返回。 这个例子只能复制简单的JavaBean,假定 JavaBean的每个属性都有public类型的getXXX() 和setXXX()方法。
7。输出 this base this sub 8。输出 this base this sub this sub2 9。输出 this base 10。输出 java this sub
1。子类无条件的继承父类的不含的不含参数的 构造函数 2。如果子类没有定义构造函数,那么它将把继 承父类的构造函数作为自己的构造函数。 3。如果定义了构造函数,在创建对象(实例化) 先执行父类无参数的构造函数,然后执行自己的 构造函数 4。对于父类的含参数的构造函数,子类通过自 己构造函数中使用Super关键字来调用它,但这 条语句必须放在构造函数的第一条语句。那么子 类不再调用父类的无参构造函数。
class Base {} class Sub extends Base {} class Sub2 extends Base {} public class cex{ public static void main(String argv[]){ Base b = new Sub(); } } A 通过编译和并正常运行。 B 编译时出现例外。 C 编译通过,运行时出现例外。
Sring s=new String(“gggg”); 这条语句生成了几个对象?
生成了两个对象: 一个对象用于存贮字符串“gggg” 另一个对象是一个引用指针 用于指向 这个存贮字符串“gggg”的对象。
Java语言的反射机制
有时候我们说某个语言具有很强的动态性,有时候我 们会区分动态和静态的不同技术与作法。我们朗朗上口动 态绑定(dynamic binding)、动态链接(dynamic linking)、动态加载(dynamic loading)等。然而“动态” 一词其实没有绝对而普遍适用的严格定义,有时候甚至像 对象导向当初被导入编程领域一样,一人一把号,各吹各 的调。 一般而言,开发者社群说到动态语言,大致认同的一 个定义是:“程序运行时,允许改变程序结构或变量类型, 这种语言称为动态语言”。从这个观点看,Perl,Python, Ruby是动态语言,C++,Java,C#不是动态语言。
3. short s1=1;s1=s1+1;有什么错误? short s1=1;s1+=1;有什么错误?
4、当编译和运行下列程序段时,会发生什么? class Base {} class Sub eLeabharlann Baidutends Base {} class Sub2 extends Base {} public class crx{ public static void main(String argv[]){ Base b = new Base(); Sub s = (Sub) b; } } A 通过编译和并正常运行。 B 编译时出现例外。 C 编译通过,运行时出现例外。
尽管在这样的定义与分类下Java不是动态语言,它却 有着一个非常突出的动态相关机制:Reflection。这个字 的意思是“反射、映象、倒影”,用在Java身上指的是我 们可以于运行时加载、探知、使用编译期间完全未知的 classes。换句话说,Java程序可以加载一个运行时才得 知名称的class,获悉其完整构造(但不包括methods定 义),并生成其对象实体、或对其fields设值、或唤起其 methods1。这种“看透class”的能力(the ability of the program to examine itself)被称为introspection(内省、 内观、反省)。Reflection和introspection是常被并提的两 个术语。
Java Reflection API简介 简介
在JDK中,主要由以下类来实现Java反射机 制,这些类都位于java.lang.reflect包中。 Class类:代表一个类。 Field类:代表类的成员变量(成员变量 也称为类的属性)。 Method类:代表类的方法。 Constructor类:代表类的构造方法。 Array类:提供了动态创建数组,以及 访问数组元素的静态方法。
class Base {} class Sub extends Base {} class Sub2 extends Base {} public class cex{ public static void main(String argv[]){ Sub b = new Sub(); Base s=(Base)b; } } A 通过编译和并正常运行。 B 编译时出现例外。 C 编译通过,运行时出现例外。
指出Java 代码错误
1. abstract class Name { private String Name; public abstract boolean doname(String name){ }; }
2. public class Something{ void doSomething(){ private String s=“”; int L=s.length(); } }
运行命令“java DumpMethods java.util.Stack”,就会显示 java.util.Stack类所具有的方法,程序的打印结果如下: public synchronized java.lang.Object java.util.Stack.pop() public java.lang.Object java.util.Stack.push(java.lang.Object) public boolean java.util.Stack.empty() public synchronized java.lang.Object java.util.Stack.peek() public synchronized int java.util.Stack.search(java.lang.Object)
class Base {Base(){ System.out.println("this Base"); }} class Sub extends Base {} class Sub2 extends Sub {} public class cex{ public static void main(String argv[]){ Sub b = new Sub(); }}
例程10-1 DumpMethods.java import java.lang.reflect.*; public class DumpMethods { public static void main(String args[]) throws Exception{ //加载并初始化命令行参数指定的类 Class classType = Class.forName(args[0]); //获得类的所有方法 Method methods[] = classType.getDeclaredMethods(); for(int i = 0; i < methods.length; i++) System.out.println(methods[i].toString()); } }
相关文档
最新文档