importjava.lang.reflect.Constructor;importjava.lang.reflect.Field;importjava.lang.reflect.Method;public classReflectTest {public static void main(String[] args) throwsException {//获取Class对象的三种方式//第一种方式获取Class对象
Student stu1 = new Student(); //这一new 产生一个Student对象,一个Class对象
Class stuClass =stu1.getClass();
System.out.println(stuClass.getName());//输出:com.gdut.reflect.Student//第二种方式获取Class对象
Class stuClass2 = Student.class;
System.out.println(stuClass==stuClass2); //输出:true//第三种方式获取Class对象
try{
Class stuClass3= Class.forName("com.gdut.reflect.Student");//注意此字符串必须是真实路径,就是带包名的类路径,包名.类名
System.out.println(stuClass3 == stuClass2);//输出:true
} catch(ClassNotFoundException e) {
e.printStackTrace();
}//通过反射获取构造方法并使用//1.加载Class对象
Class clazz = Class.forName("com.gdut.reflect.Student");
System.out.println("**********所有公有构造方法*************");
Constructor[] consArrays= clazz.getConstructors(); //就是构造方式被public修饰的
for(Constructor c : consArrays) {
System.out.println(c);
}
System.out.println("************所有的构造方法(包括:私有、受保护、默认、公有)***************");
consArrays= clazz.getDeclaredConstructors(); //就是所有的构造方法,不限制访问权限
for(Constructor c : consArrays){
System.out.println(c);
}
System.out.println("*****************获取公有、无参的构造方法*******************************");
Constructor con= clazz.getConstructor(null);//1>、因为是无参的构造方法所以类型是一个null,不写也可以:这里需要的是一个参数的类型,切记是类型//2>、返回的是描述这个无参构造函数的类对象。
System.out.println("con = " +con);//调用构造方法
Object obj =con.newInstance();
System.out.println("obj = " +obj);
System.out.println("******************获取私有构造方法,并调用*******************************");
con= clazz.getDeclaredConstructor(int.class);
System.out.println(con);//调用构造方法
con.setAccessible(true);//暴力访问(忽略掉访问修饰符),没有这条,下面就会报错
obj = con.newInstance(11);//获取成员变量并调用
System.out.println("************获取所有公有的字段********************");
Field[] fieldArray=clazz.getFields();for(Field f : fieldArray){
System.out.println(f);
}
System.out.println("************获取所有的字段(包括私有、受保护、默认的)********************");
fieldArray=stuClass.getDeclaredFields();for(Field f : fieldArray){
System.out.println(f);
}
System.out.println("*************获取公有字段**并调用***********************************");
Field f= clazz.getField("name");
System.out.println(f);//获取一个对象
obj = clazz.getConstructor().newInstance();//产生Student对象--》Student stu = new Student();//为字段设置值
f.set(obj, "刘德华");//为Student对象中的name属性赋值--》stu.name = "刘德华"//验证
Student stu =(Student)obj;
System.out.println("验证姓名:" +stu.name);
System.out.println("**************获取私有字段****并调用********************************");
f= clazz.getDeclaredField("phoneNum");
System.out.println(f);
f.setAccessible(true);//暴力反射,解除私有限定
f.set(obj, "18888889999");
System.out.println("验证电话:" +stu);
System.out.println("***************获取所有的”公有“方法*******************");
Method[] methodArray=clazz.getMethods();for(Method m : methodArray){
System.out.println(m);
}
System.out.println("***************获取所有的方法,包括私有的*******************");
methodArray=clazz.getDeclaredMethods();for(Method m : methodArray){
System.out.println(m);
}
System.out.println("***************获取公有的show1()方法*******************");
Method m= clazz.getMethod("show1", String.class);
System.out.println(m);//实例化一个Student对象
obj =clazz.getConstructor().newInstance();
m.invoke(obj,"刘德华");
System.out.println("***************获取私有的show4()方法******************");
m= clazz.getDeclaredMethod("show4", int.class);
System.out.println(m);
m.setAccessible(true);//解除私有限定
Object result = m.invoke(obj, 20);//需要两个参数,一个是要调用的对象(获取有反射),一个是实参
System.out.println("返回值:" +result);
}
}classStudent {publicString name;protected intage;charsex;privateString phoneNum;
Student(String str) {
System.out.println("defalut (默认)的构造方法 string = " +str);
}publicStudent() {
System.out.println("public 调用了公有、无参构造方法执行了。。。");
}//有一个参数的构造方法
public Student(charsex){
System.out.println("public 有一个参数的构造函数 char" +sex);
}public Student(String name ,intage){
System.out.println("public 有多个参数的构造方法 string:"+name+" int:"+age);
}protected Student(booleann){
System.out.println("protected 受保护的构造方法 boolean = " +n);
}private Student(intage){
System.out.println("private 私有的构造方法 int:"+age);
}public voidshow1(String s){
System.out.println("public 调用了:公有的,String参数的show1(): s = " +s);
}protected voidshow2(){
System.out.println("protected 调用了:受保护的,无参的show2()");
}voidshow3(){
System.out.println("default 调用了:默认的,无参的show3()");
}private String show4(intage){
System.out.println("private 调用了,私有的,并且有返回值的,String参数的show4(): age = " +age);return "abcd";
}
@OverridepublicString toString() {return "Student [name=" + name + ", age=" + age + ", sex=" +sex+ ", phoneNum=" + phoneNum + "]";
}
}