java 反射 报错_java 反射

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 + "]";

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值