现在我们已经可以获得Class对象啦,如何利用反射构造一个这种类型的新的对象呢?首先要获得你要反射的对象的类的构造方法,是吧!再看这句话"一个类中的每个成员都可以用相应的反射包中的一个类的实例对象来表示,通过Class类的方法可以得到这些实例对象;"
我要告诉你的是这个“成员”就包括:类的构造函数、成员变量、方法等一些信息。而他们所对应的反射包中的类分别是:Constructor类、Field类、Method类。
一。Constructor类代表某个类中的一个构造方法
1.得到某个类所有的构造方法
例如:Constructor[]constructors=Clsaa.forName("java.lang.String").getConstructors();
2.得到一个具体的构造方法
Constructor constructor=Class.forName("java.lang.String").getConstructor(StringBuffer.class);//获得方法时要提供相应的类型参数
3.创建实例对象:
方法一:String str=(String)constructor.newInstance(new StringBuffer("abc"));//调用获得的构造方法是注意传入的参数类型一致。
方法二:Class.newInstance()方法 :该方法内部先得到默认构造方法的对象,然后用该构造方法的对象创建实例对象。
String obj = (String)Class.forName("java.lang.String").newInstance();
二。 Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段。Object get(object obj)返回指定对象上此 Field 表示的字段的值。如果该值是一个基本类型值,则自动将其包装在一个对象中。
基础字段的值是按以下方式获得的:
User user=new User("wangfayin",20);
Field name=user.getClass().getField("name"); //要注意现在我们获得的是一个User类中名称为 name 的字段对象,而不是一个值,也不是一个具体User对象的字段;
String nameStr=(String)name.get(user); //获得的是一个Object类型,要进行强制类型转换。
System.out.println(nameStr);
如果基础字段是一个静态字段,则可以忽略get中 参数 将其设置为 null。
三。Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。
invoke(Object obj, Object... args)
对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。
用反射的方法调用某个main方法实例如下:
Class userClass=user.getClass();
Method say = userClass.getMethod("say");
User newUser=(User) userClass.getConstructor(String.class,int.class).newInstance("Li",30);
say.invoke(newUser);
有不清楚得地方欢迎交流!