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表示的方法