}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();
}
//获得指定的构造方法