网站代理服务器有问题,wordpress ajax 分页插件,进出口贸易,网站开发设计的阶段基本概念 在Java运行时环境中#xff0c;对于任意一个类#xff0c;能否知道这个类有哪些属性和方法#xff1f;对于任意一个对象#xff0c;能否调用它的任意一个方法#xff1f; 答案是肯定的。 这种动态获取类的信息以及动态调用对象的方法的功能来自于Java语言的反射对于任意一个类能否知道这个类有哪些属性和方法对于任意一个对象能否调用它的任意一个方法 答案是肯定的。 这种动态获取类的信息以及动态调用对象的方法的功能来自于Java语言的反射Reflection机制。 Java反射机制主要提供了以下功能 1.在运行时判断任意一个对象所属的类。 2.在运行时构造任意一个类的对象。 3.在运行时判断任意一个类所具有的成员变量和方法。 4.在运行时调用任意一个对象的方法。 5.在运行时设定任意一个对象的属性值。 Reflection是Java被视为动态或准动态语言的一个关键性质。 这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息。 包括其modifiers诸如public、static等、 superclass例如Object、实现了的 interfaces 例如Serializable、也包括其constuctorsfields和methods的所有信息并可于运行时改变fields内容或调用methods。 动态语言 动态语言的定义“程序运行时允许改变程序结构或者变量类型这种语言称为动态语言”。 从这个观点看PerlPythonRuby是动态语言CJavaC#不是动态语言。 尽管在这样的定义与分类下Java不是动态语言它却有着一个非常突出的动态相关机制Reflection。这个字的意思是反射、映像、倒影用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。 换句话说Java程序可以加载一个运行时才得知名称的class获悉其完整构造但不包括methods定义并生成其对象实体、或对其fields设值、或唤起其methods。 这种“看透”class的能力the ability of the program to examine itself被称为introspection内省、内观、反省。Reflection和introspection是常被并提的两个术语。 Java Reflection API简介 在JDK中主要由以下类来实现Java反射机制这些类除了第一个都位于java.lang.reflect包中 Class类代表一个类位于java.lang包下。 Field类代表类的成员变量成员变量也称为类的属性。 Method类代表类的方法。 Constructor类代表类的构造方法。 Array类提供了动态创建数组以及访问数组的元素的静态方法。 Class对象 要想使用反射首先需要获得待操作的类所对应的Class对象。 Java中无论生成某个类的多少个对象这些对象都会对应于同一个Class对象。 这个Class对象是由JVM生成的通过它能够获悉整个类的结构。 常用的获取Class对象的3种方式 1.使用Class类的静态方法。例如: Class.forName(java.lang.String); 2.使用类的.class语法。如: String.class; 3.使用对象的getClass()方法。如 String str aa;
Class? classType1 str.getClass(); getClass()方法定义在Object类中不是静态方法需要通过对象来调用并且它声明为final表明不能被子类所覆写。 直接print所获得的Class对象classType会输出 class 完整类名 如果调用该Class对象的getName()方法则输出完整类名不加class。 例程1获取方法 例程DumpMethods类演示了Reflection API的基本作用它读取命令行参数指定的类名然后打印这个类所具有的方法信息。 import java.lang.reflect.Method;public class DumpMethods
{public static void main(String[] args) throws Exception //在方法后加上这句异常就消失了{//获得字符串所标识的类的class对象Class? classType Class.forName(java.lang.String);//在此处传入字符串指定类名所以参数获取可以是一个运行期的行为可以用args[0]//返回class对象所对应的类或接口中所声明的所有方法的数组包括私有方法Method[] methods classType.getDeclaredMethods();//遍历输出所有方法声明for(Method method : methods){System.out.println(method);}}} 例程2通过反射调用方法 通过反射调用方法。详情见代码及注释 import java.lang.reflect.Method;public class InvokeTester
{public int add(int param1, int param2){return param1 param2;}public String echo(String message){return Hello: message;}public static void main(String[] args) throws Exception{// 以前的常规执行手段InvokeTester tester new InvokeTester();System.out.println(tester.add(1, 2));System.out.println(tester.echo(Tom));System.out.println(---------------------------);// 通过反射的方式// 第一步获取Class对象// 前面用的方法是Class.forName()方法获取// 这里用第二种方法类名.classClass? classType InvokeTester.class;// 生成新的对象用newInstance()方法Object invokeTester classType.newInstance();System.out.println(invokeTester instanceof InvokeTester); // 输出true// 通过反射调用方法// 首先需要获得与该方法对应的Method对象Method addMethod classType.getMethod(add, new Class[] { int.class,int.class });// 第一个参数是方法名第二个参数是这个方法所需要的参数的Class对象的数组// 调用目标方法Object result addMethod.invoke(invokeTester, new Object[] { 1, 2 });System.out.println(result); // 此时result是Integer类型//调用第二个方法Method echoMethod classType.getDeclaredMethod(echo, new Class[]{String.class});Object result2 echoMethod.invoke(invokeTester, new Object[]{Tom});System.out.println(result2);}
} 生成对象 若想通过类的不带参数的构造方法来生成对象我们有两种方式 1.先获得Class对象然后通过该Class对象的newInstance()方法直接生成即可 Class? classType String.class;Object obj classType.newInstance(); 2.先获得Class对象然后通过该对象获得对应的Constructor对象再通过该Constructor对象的newInstance()方法生成 其中Customer是一个自定义的类有一个无参数的构造方法也有带参数的构造方法 Class? classType Customer.class;// 获得Constructor对象,此处获取第一个无参数的构造方法的Constructor cons classType.getConstructor(new Class[] {});// 通过构造方法来生成一个对象Object obj cons.newInstance(new Object[] {}); 若想通过类的带参数的构造方法生成对象只能使用下面这一种方式 Customer为一个自定义的类有无参数的构造方法也有一个带参数的构造方法传入字符串和整型 Class? classType Customer.class;Constructor cons2 classType.getConstructor(new Class[] {String.class, int.class});Object obj2 cons2.newInstance(new Object[] {ZhangSan,20}); 可以看出调用构造方法生成对象的方法和调用一般方法的类似不同的是从Class对象获取Constructor对象时不需要指定名字而获取Method对象时需要指定名字。 原文转至与http://www.cnblogs.com/mengdd/archive/2013/01/26/2877972.html转载于:https://www.cnblogs.com/onlysun/p/4530451.html