1、Person p=new Person();这是什么?当然是实例化一个对象了.可是这种实例化对象的方法存在一个问题,那就是必须要知道类名才可以实例化它的对象,这样我们在应用方面就会受到限制.那么有没有这样一种方式,让我们不知道这个类的类名就可以实例化它的对象呢?Thank Goodness!幸亏我们用的是java, java就提供了这样的机制.1).java程序在运行时可以获得任何一个类的字节码信息,包括类的修饰符(public,static等),基类(超类,父类),实现的接口,字段和方法等信息.2).java程序在运行时可以根据字节码信息来创建该类的实例对象,改变对象的字段内容和调用对象方法
2、.这样的机制就叫反射技术.可以想象光学中的反射,就像我们照镜子,镜子中又出现一个自己(比喻可能不太恰当,但是足以表达清楚意思了).反射技术提供了一种通用的 接程序 的方法,不必要 程序 要的类 码到 程序中, 得我们可以创建 的程序.Java的反射机制是通 反射API来实现的,它 程序在运行 程中 得任何一个 知名 的类的内 信息.反射API java.lang.reflect包中. 要包括以 类:1).Constructor类:用来 一个类的 方法2).Field类:用来 一个类的变3).Method类:用来 一个类的方法.4).Modifer类:用来 类内的修饰符5).Array:用来对c
3、urrency1 行“.Constructor,Field,Method这个类是JVM(fifl机)在程序运行时创建的,用来表 类中应的.这个类实现了java.lang.reflect.Member接口,Member接口 了获 类 方法等信息的方法.要 用这反射API,必须得到要“的对象类的Class类的实例.通 调用Class类的newInstance方法(能调用类的” 方法)可以创建类的实例.这样有限,我们可以 类的Class实例获 类 要的 方法,然在 用反射来创建类的一个实例.一.获 类的 方法的Constructor对象(currency1 )Constructor getDecla
4、redConstructors(); 类的 有的 方法的Constructor对象currency1 .Constructor getDeclaredConstructor(Class paramTypes); 类的 方法的Constructor对象,paramTypes了currency1类 .Constructor getConstructors(); 类的 有的public类 的 方法的Constructor对象currency1 .Constructor getConstructor(Class paramTypes); 类的的public类 的 方法的Constructor对象,pa
5、ramTypes了currency1类 . 个类中没有 方法,一个和个方法的currency1 中有一个,就是的 方法;个类中 了有currency1的 currency1, 没有 currency1,一个和个方法的currency1 中不包 的 方法.例子:import java.lang.reflect.*;public class DumpMethods public static void main(String args) tryif(args.length1)System.out.println(“ 的类名 “);return;Class strClass=Class.forNam
6、e(args0);/ 有currency1的 方法Class strArgsClass=new Class byte.class,String.class;Constructor constructor=strClass.getConstructor(strArgsClass);System.out.println(“Constructor:“+constructor.toString();/调用 有currency1的 方法创建实例对象objectbyte bytes=“java就 “.getBytes();Object strArgs=new Objectbytes,“gb2312“;Ob
7、ject object=constructor.newInstance(strArgs);System.out.println(“Object“+object.toString();catch(Exception e)e.printStackTrace(); 运行 :.获 类变的Field对象(currency1 )Field getDeclaredFields(): 类的 有变的Field对象currency1 ,不包括 父类的变.Field getDeclaredField(String name): 类的 有变的Field对象,不包括 父类 的变,currency1name变的名 .Fi
8、eld getFields(): 类的 有public 的变的Field对象currency1 ,包括 父类的变Field getField(String name): 类的 有变的Field对象,包括 父类 的变,currency1name变的名 .例子:import java.lang.reflect.*;public class ReflectTest private String name;private String age;public ReflectTest(String name,String age)this.name=name;this.age=age;public sta
9、tic void main(String args) / TODO 自 方法存根tryReflectTest rt=new ReflectTest(“zhanghandong“,“shiba“);fun(rt);catch(Exception e)e.printStackTrace();public static void fun(Object obj) throws ExceptionField fields=obj.getClass().getDeclaredFields();System.out.println(“ 的:“); for(Field field:fields)System.
10、out.println(field.getName()+“=“+field.get(obj); if(field.getType().equals(java.lang.String.class)field.setAccessible(true); /必须 true才可以修改变String org=(String)field.get(obj);field.set(obj,org.replaceAll(“a“,“b“);System.out.println(“ 的 “);for(Field field:fields)System.out.println(field.getName()+“=“+fi
11、eld.get(obj); 运行 :.获 类的方法的Method对象(currency1 )Method getDeclaredMethods(): 类的 有方法的Method对象currency1 ,不包括 父类的方法.Method getDeclaredMethod(String name,Class paramTypes): 类的 有方法的Method对象,不包括 父类 的方法,currency1name方法的名 ,currency1paramTypes方法的currency1类 .Method getMethods(): 类的 有方法的Method对象currency1 ,包括 父类
12、的方法.Method getMethod(String name,Class paramTypes): 类的 有方法的Method对象,包括 父类 的方法,currency1name方法的名 ,currency1paramTypes方法的currency1类 . 类的 信息int getModifiers(): 类的修饰符的 .Package getPackage(): 类的包名Class getSuperclass(): 类的父类的Class实例.Class getInterfaces(): 类实现的接口的Class对象currency1 .boolean isInterface(): 类是 是接口.反射的能 ,但是 用不当可能会 ,反射 码,会 来 的问题.