Java中的反射的应用(二)

2014-11-24 01:08:50 · 作者: · 浏览: 2
e("org.lxh.demo15.Person");

}catch(ClassNotFoundException e){

e.printStackTrace();

}

Constructor con[]=c1.getConstructors();//得到全部构造方法

for(int i=0;i

System.out.println("构造方法:"+con[i]);//直接打印输出

}

}

}

还原修饰符

在整个Java中对于方法的修饰符使用一定的数字表示出来的,而如果要想把这个数字还原成用户可以看懂的关键字,则必须依靠Modifier类完成,此类定义在java.lang.reflect包中。直接使用Modifer类的一下方法可修饰符:

publicstatic String toString(int mod)

int mo = con[i].getModifiers();

System.out.print(Modifier.toString(mo)+””); //还原权限

getDeclaredMethods()方法,此方法返回一个Method类的对象数组,而如果要想进一步取得方法具体信息,例如:方法的参数,抛出的异常声明等等,则就是必须依靠Method类

再反射操作中同样可以取得一个类中的全部属性,但是在取得属性的时候有以下两种不同的操作:

得到实现的接口或父类中的公共属性:public Field[] getFields() throwsSecurityException

得到本类中自己定义的的全部属性:public Field[] getDeclaredFields() throws SecurityException

如果要使用反射调用类中的方法可以通过Method类完成,操作步骤如下:

1、 通过Class类的getMethod(Stringname,Class…parameterTypes)方法取得一个Method的对象,并设置此方法操作时所需的参数类型。

2、 之后才可以使用invoke进行调用,并向方法中传递要设置的参数。

在Proxy类中的newProxyInstance()方法中,需要一个ClassLoader类的实例,ClassLoader实际上对应的是类加载器,在Java中主要有以下三种类加载器:

BootstrapClassLoader:此加载器采用C++ 编写,一般开发中是看不到的;

ExtensionClassLoader:用来进行扩展类的加载,一般对应的是jre\lib\ext目录中的类;

AppClassLoader:加载classpath指定的类,是最常用使用的一种加载器。

通过forName()加载类两次时,此时的类只加载了一次

如果有以下代码:

Object obj= new VipUser();//这里VipUser是User的子类,它继承了User

if(obj instanceof User){

System.out.println("instanceof判断是一个user");

User user = (User)obj;

}

当使用以上代码中的instanceof来判断时,此时obj就是一个User了,但实际上它不是。它只是User的一个子类。

总结:使用instanceof时主要用来判断是否实现了后面的接口。

if(obj.getClass()==User.class){

System.out.println("getClass判断,是一个user");

User user = (User)obj;

}

而getClass()用于判断对象的准确类型。

在后面用到的类:

package toto.learn1;

publicclass User {

private String name;

private String password;

private String gender;

public User(String name, String password, String gender) {

super();

this.name = name;

this.password = password;

this.gender = gender;

}

public User() {

super();

// TODO Auto-generatedconstructor stub

}

public User(String name, String password) {

super();

this.name = name;

this.password = password;

}

public String getName() {

returnname;

}

publicvoid setName(String name) {

this.name = name;

}

public String getPassword() {

returnpassword;

}

publicvoid setPassword(String password) {

this.password = password;

}

public String getGender() {

returngender;

}

publicvoid setGender(String gender) {

this.gender = gender;

}

publicvoid run(String str, int num){

System.out.println("run");

}

publicvoid run(String name){

System.out.println("hello:"+name);

}

}

以下是关于反射的部分。

package toto.learn1;

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.lang.reflect.Modifier;

publicclass Demo2 {

/**

* 反射

* @throwsIllegalAccessException

* @throwsInstantiationException

* @throwsNoSuchMethodException

* @throwsSecurityException

*/

publicstaticvoid main(String[] args) throws Exception {

Class clazz = User.class;

//构造方法

//获得构造方法

Constructor[] cons = clazz.getConstructors();

for(Constructor con : cons){

//参数列表,获得的约定是完整的参数类型,包括这种类型坐在的包。

Class[] types = con.getParameterTypes();

System.out.println("参数类型为:");

for(Class type:types){

System.out.println(type.getName()+"...");

}

System.out.println();

}

//获得指定的构造方法