java获取反射的三种方法,通过java的反射机制,能直接获取到的信息有

  java获取反射的三种方法,通过java的反射机制,能直接获取到的信息有

  写爬虫互联网协议(互联网协议)被封了怎么解决?立即使用

  目录

  1.获取字段2。反编译字段3。通过反射机制访问对象属性4.可变长度参数5.反射方法(了解)6.反编译(了解)7.反射机制调用方法8.反射建筑工人9。反射机制调用构造方法10.获取父类和父接口在前面一节我们介绍了反射机制的详细内容反射机制,本节我们将介绍通过反射获取类的属性、方法等信息。

  1.获取Field

  公共类反射测试03 {

  公共静态void main(String[] args)引发异常{

  //1.获取整个类

  班级学生班级=班级。forname( cn。御姐。比恩。学生’);

  字符串类名=学生类。getname();

  系统。出去。println(类名);

  系统。出去。println(学生类。get simplename());

  //获取类中的所有公众的的田

  field[]fields=学生类。获取字段();

  系统。出去。println(字段。长度);//测试数组中只有一个元素

  //测试这个领域

  字段f=字段[0];

  //取出领域的它的名字

  字符串字段名=f . getname();

  System.out.println(字段名称);

  //获取所有的田

  //获取所有的田

  field[]fs=学生类。getdeclaredfields();

  系统。出去。println(fs。长度);

  系统。出去。println(-);

  //遍历

  for(Field field :fs){

  //获取属性的修饰符列表

  //返回的修饰符是一个数字,每个数字是修饰符的代号

  int I=field。get修饰符();

  //可以将这个代号数字转换成字符串

  字符串修饰符string=修饰符。tostring(I);

  系统。出去。print(修饰符字符串“”);

  //获取属性的类型

  类字段类型=字段。gettype();

  字符串fName=字段类型。get simplename();

  系统。出去。print(fName );

  //获取属性的名字

  系统。出去。println(字段。getname()“”);

  系统。出去。println();

  }

  }}2.反编译Field

  通过反射机制,反编译一个类的属性田

  公共类反射测试05 {

  公共静态void main(String[] args)引发异常{

  //创建这个是为了拼接字符串

  StringBuilder s=new StringBuilder();

  班级学生班级=班级。forname( cn。御姐。比恩。学生’);

  s。append(修饰符。tostring(学生类。get修饰符()) class 学生类。get simplename() { );

  field[]fields=学生类。getdeclaredfields();

  s。追加(;\ n’);

  对于(字段字段:字段){

  s。追加( \ t );

  s。append(修饰符。tostring(字段。get修饰符()));

  s。追加(" ");

  s.append(field.getType().get simplename());

  s。追加(" ");

  s。追加(字段。getname());

  s。追加(;\ n’);

  }

  s。追加( } );

  系统。出去。println(s);

  }}

  3.通过反射机制访问对象属性

  必须掌握:怎么通过反射机制访问一个对象的属性给属性赋值set获取属性的值get

  公共类反射测试07 {

  公共静态void main(String[] args)引发异常{

  班级学生班级=班级。forname( cn。御姐。比恩。学生’);

  //使用反射机制,怎么取访问一个对象的属性

  对象obj=学生类。新实例();//obj就是学生对象(底层调用无参数构造方法)

  //获取不属性(根据属性的名称获取场)

  字段编号=学生班级。getdeclaredfield( no );

  //给目标文件对象(学生对象)的不属性赋值

  //s . no=111;//给s对象的不属性赋值111,三要素,对象,属性和值

  //虽然使用了反射机制,但是三要素还是缺一不可

  //注意,反射机制让代码复杂了,但是为了一个灵活,这也是值得的。

  noFiled.set(obj,222);//给目标文件对象的不属性赋值222

  //读取属性的值

  //两个要素:获取目标文件对象不属性的值

  系统。出去。println(无存档。get(obj));

  //可以访问私有属性吗

  字段名field=学生班级。getdeclaredfield( name );

  //打破封装(反射机制的缺点:打破封装,可能会给不法分子留下机会)

  名称字段。设置可访问性(true);

  //给名字属性赋值

  nameField.set(obj, Jackson );

  //获取名字属性的值

  系统。出去。println(名称字段。get(obj));

  }}4.可变长度参数

  可变长度参数int… args这就是可变长度参数

  语法是:类型…(注意:一定是3个点)

  1.可变长度参数要求的参数个数是0-n个2.可变长度参数在参数列表中必须在最后一个位置上,而且可变长度参数必须只有一个3.可变长度可以看成一个数组公共类参数测试{

  公共静态void main(String[] args) {

  m();

  m(10);

  m(20,40);

  //m( ABC );编译错误

  m3(ab , cd , def , de9 );

  String [] strs={a , b , c };

  m3(strs);

  }

  公共静态void m(int.args){

  }

  //必须在最后一个,且只有一个//公共静态空洞m2(字符串.args1,int.args2){////}

  公共静态空隙m3(字符串.args){

  //可以将可变长度参数当成一个数组来看

  for(int I=0;iargs.lengthi ){

  系统。出去。println(args[I]);

  }

  }}5.反射Method(了解)

  公共类反射测试08 {

  公共静态void main(String[] args)引发异常{

  //获取类了

  class userServiceClass=class。forname( cn。御姐。服务。userservice’);

  //获取所有的方法(包括私有的)

  method[]methods=用户服务类。getdeclaredmethods();

  系统。出去。println(方法。长度);//2

  //遍历方法

  对于(方法方法:方法){

  //获取修饰符列表

  系统。出去。println(修饰符。tostring(方法。get修饰符()));

  //获取方法的返回值类型

  系统。出去。println(方法。获取returntype().get simplename());

  //获取方法名

  系统。出去。println(方法。getname());

  //方法的参数列表(一个方法的参数可能有多个)

  class[]参数类型=方法。getparametertypes();

  对于(类参数类型:参数类型){

  系统。出去。println(参数类型。get simplename());

  }

  }

  }}6.反编译(了解)

  公共类反射测试09 {

  公共静态void main(String[] args)引发异常{

  StringBuilder s=new StringBuilder();

  class userServiceClass=class。forname( cn。御姐。服务。userservice’);

  s。append( public class UserService { );

  s。append(修饰符。tostring(用户服务类。get modifiers())“class”用户服务类。get simplename() { \ n );

  method[]methods=用户服务类。getdeclaredmethods();

  对于(方法方法:方法){

  s。追加( \ t );

  s。append(修饰符。tostring(方法。get修饰符()));

  s。追加(" ");

  s.append(method.getReturnType().get simplename());

  s。追加(" ");

  s。append(方法。getname());

  s。追加(();

  //参数列表

  class[]参数类型=方法。getparametertypes();

  对于(类参数类型:参数类型){

  s。追加(参数类型。get simplename());

  s.append(,);

  }

  s。append(){ } \ n );

  }

  //删除指定下标位置上的字符

  s。删除charat(s . length()-1);

  s。追加( } );

  系统。出去。println(s);

  }}7.反射机制调用方法

  重点:必须掌握,通过反射机制怎么调用一个方法。反射机制让代码更具有通用性,将来修改配置文件后,创建的对象不一样了,调用的方法也不同了,但是java代码不需要做任何改动,这就是反射的魅力

  公共类反射测试10 {

  公共静态void main(String[] args)引发异常{

  //通过反射机制调用方法

  class userServiceClass=class。forname( cn。御姐。服务。userservice’);

  //创建对象

  object obj=userserviceclass。新实例();

  //java中有重载,java中通过方法名和形参来区分方法

  方法登录方法=用户服务类别。getdeclaredmethod( log in ,String.class,String。类);

  //调用方法

  //调用方法有几个要素

  //要素1:对象,要素2:方法名,要素3:参数列表,要素4:返回值

  //反射机制中最重要的一个方法:必须记住

  //四要素

  /*

  登录方法方法,对象对象

  管理,123是参数列表,返回值是返回值

  * */

  对象返回值=登录方法。invoke(obj, admin , 123 );

  }}8.反射Constructor

  公共类反射测试11 {

  公共静态void main(String[] args)引发异常{

  StringBuilder s=new StringBuilder();

  class VIP class=class。forname( cn。御姐。比恩。VIP’);

  s。append(修饰符。tostring(VIP类。get修饰符()));

  s。append( class );

  s。追加(VIP类。get simplename());

  s。append( { \ n );

  //拼接构造方法

  构造函数[]构造函数=VIP类。getdeclaredconstructors();

  对于(构造函数构造函数:构造函数){

  s。追加( \ t );

  s。append(修饰符。tostring(构造函数。get修饰符()));

  s。追加(" ");

  s。追加(VIP类。get simplename());

  s。追加(();

  class[]参数类型=构造函数。getparameter types();

  对于(类参数类型:参数类型){

  s。追加(参数类型。get simplename());

  s.append(,);

  }

  if(parameterTypes.length0) {

  s。删除charat(s . length()-1);

  }

  s。append(){ } \ n );

  }

  s。追加( } );

  系统。出去。println(s);

  }}9.反射机制调用构造方法

  公共类反射测试12 {

  公共静态void main(String[] args)引发异常{

  //使用反射机制怎么创建对象

  class VIP class=class。forname( cn。御姐。比恩。VIP’);

  //调用无参构造方法

  对象obj=VIP类。新实例();

  //调用有参数构造方法

  //第一步:先获取到有参数构造方法

  构造函数con=VIP类。getdeclaredconstructor(int。class,String.class,String.class,boolean。类);

  //第二步:调用构造方法新的对象

  object new obj=con . new instance(110, jackson , 1999-10-11 ,true);

  系统。出去。println(新obj);

  }}

  10.获取父类和父接口

  公共类反射测试13 {

  公共静态void main(String[] args)引发异常{

  //字符串举例

  class字符串class=class。forname( Java。郎。string’);

  //获取线的父类

  class超类=string类。get超类();

  系统。出去。println(超类。get simplename());

  //获取线类实现的所有接口

  class[]interfaces=string类。get interfaces();

  对于(类入:接口){

  系统。出去。println(英寸。getname());

  }

  }}以上就是爪哇介绍通过反射获取类的信息的详细内容,更多请关注我们其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: