Java中的反射的应用(三)

2014-11-24 01:08:50 · 作者: · 浏览: 1
创建对象

try {

Object obj = clazz.newInstance();//默认调用无参的构造方法

System.out.println(obj.getClass());

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

}

/**参数类型为:

java.lang.String...

java.lang.String...

参数类型为:

java.lang.String...

java.lang.String...

java.lang.String...

class toto.learn1.User*/

System.out.println("-------------------------");

//获得指定的构造方法2 创建对象

Object obj = clazz.newInstance();//默认调用无参的构造方法

Constructor constructor = clazz.getConstructor(String.class,String.class);//此处调用有两个参数的构造方法

//String.class是因为构造方法中有带有年个参数的构造方法的形参都是String类的。

User usr = (User)constructor.newInstance("toto","查看");//传递两个参数。

System.out.println(usr.getName()+" "+usr.getPassword());//结果:toto 查看

//方法

//获得类所有的方法

Method [] methods = clazz.getMethods();

for(Method method:methods){

System.out.println(method.getName());

}

/**通过getMethods()方法获得的类中包含有父类的方法,并且拿到的是共有的方法

* run

run

getName

setName

getPassword

setPassword

getGender

setGender

wait

wait

wait

hashCode

getClass

equals

toString

notify

notifyAll

* */

//如果想获得声明的所有方法,包括非public的,不包括继承的,可以使用一下途径实现

System.out.println("-----------------------");

Method [] methods2 = clazz.getDeclaredMethods();

for(Method method:methods2){

System.out.println(method.getName());

}

/**结果是:

* run

run

getName

setName

getPassword

setPassword

getGender

setGender*/

//获得指定的方法,调用方法

Method runMethod = clazz.getMethod("run", String.class); /**第一个表示要调用那个方法

第二个参数是可变参数,表示调用的润方法的参数类型。*/

//获得了方法后,要执行时,得给出一个对象,在这里要执行的对象是User,故作如下实例

User usr1 = new User();

runMethod.invoke(usr1, "toto");//表示执行usr1对象中的runMethod方法,并且向方法中传递了参数。

/**

* 运行结果:hello:toto 此为User类中run(String name);方法输出的结果,其中name即为toto*/

//属性

//获得对象的属性,先创建一个对象

Object object = new User("toto","123","male");//调用User中的构造方法:

//由于获得对象的私有属性,得获得get方法,故得先获得对象的字节码文件,通过这个文件获得get方法

Class objectClazz = object.getClass();

//获得get方法

Method runMethod2 = clazz.getMethod("getName"); //由于该方法没有参数,故不用在向里面传递参数

//执行此方法,输出参数

Object name = runMethod2.invoke(object);

System.out.println(name);//由于上面传递了name值,故此处返回的结果值为:toto

//获得所有属性

System.out.println("-------------------------------");

//Field[] fields =clazz.getFields();//此方法拿到的是public的属性,由于User类中没有共有的属性

Field[] fields = clazz.getDeclaredFields();//拿到声明的属性

for(Field fd : fields){

System.out.println(fd.getName()+"属性类型: "+fd.getType());

}

/** 结果为:

* name属性类型: class java.lang.String

password属性类型: class java.lang.String

gender属性类型: class java.lang.String*/

//为对象的password属性赋值:

User user2 = new User();

String fieldName = "password";//作为变量来处理的,可以传递任意的属性名称

//getpw是通过反射拿到的属性,其实就是password

Field getpw = user2.getClass().getDeclaredField(fieldName);

//判断属性是否为私有:

int num = getpw.getModifiers();//返回的是整型的值。

if(num == Modifier.PRIVATE){//获得的是

System.out.println("属性是私有的");

//让java虚拟机不检查访问权限

//getpw.setAccessible(true);

}

//System.out.println(getpw);//结果private java.lang.Stringtoto.learn1.User.password

getpw.set(user2, 234567);//前一个参数表示的是为那个对象赋密码。

System.out.println(user2.getPassword());

}

}

l 通过Field类访问对象属性时,需要注意访问权限的问题,若对象

的属性被声明为私有,则无法访问,此时需要打开java语言检查

filed.setAccessible(true);

l Method类代表某个类中的一个成员方法

l 通过invoke方法可以调用Method表示的方法