Java反射是什么,java的反射是什么

  Java反射是什么,java的反射是什么

  如何解决写爬虫IP受阻的问题?立即使用。

  本教程运行环境:windows7系统,java8版本8,DELL G3电脑。

  

什么是反射(Reflection )?

  主要指程序访问、检测和修改自身状态或行为的能力。

  

Java反射?

  在Java运行时环境中,对于任何一个类,你能知道这个类有什么属性和方法吗?你能调用任何对象的任何方法吗?

  Java反射机制主要提供了以下功能:

  * 1.确定任何对象在运行时所属的类。

  * 2.在运行时构造任何类的对象。

  * 3.在运行时判断任何类的成员变量和方法。

  * 4.在运行时调用任何对象的方法。

  

Reflectio

  反射是Java被视为动态(或准动态)语言的一个关键属性。

  这种机制允许程序在运行时通过反射API获得任何具有已知名称的类的内部信息。

  包括其修饰符的所有信息(如public、static等。)、超类(比如Object)、实现的接口(比如Serializable)、字段和方法,并且可以在运行时改变字段的内容或者调用方法。

  

动态语言

  动态语言的定义“程序运行时,允许改变程序结构或变量类型。这种语言叫做动态语言”。

  从这个角度来说,Perl、Python、Ruby都是动态语言,而C、Java、C#都不是动态语言。

  虽然在这个定义和分类下,Java并不是动态语言,但是它有一个非常突出的动态关联机制:反射。这个词的意思是:反思,反思,反思。在Java中使用时,意味着我们可以加载、检测和使用编译时完全未知的类。

  换句话说,Java程序可以加载一个只有在运行时才知道名字的类,学习它的完整结构(但不是方法的定义),生成它的对象实体,或者设置它的字段,或者调用它的方法。

  “看透”类的能力(程序自我检查的能力)称为内省(内省、洞察和反思)。反思和自省是两个经常一起被提及的术语。

  

Java Reflection API简介

  在JDK,Java反射机制主要由以下几个类实现,这些类(除了第一个)都位于java.lang.reflect包中。

  Class:它代表一个类,位于java.lang包下。

  Class:代表类的成员变量(成员变量也称为类的属性)。

  方法类:表示该类的方法。

  构造函数类:表示类的构造方法。

  Array类:提供动态创建数组和访问数组元素的静态方法。

  

Class对象

  要使用反射,首先需要获取要操作的类对应的类对象。

  在Java中,不管一个类生成多少个对象,这些对象都会对应同一个类对象。

  这个类对象是JVM生成的,通过它可以知道整个类的结构。

  常用3种方法获取类对象:

  1.使用Class类的静态方法。例如:

  class . forname(" Java . lang . string ");2.使用。类的类语法。比如:

  String.class3.使用对象的getClass()方法。比如:

  String str=" aa

  例程1:获取方法

  例程DumpMethods类演示了反射API的基本功能。它读取由命令行参数指定的类名,然后打印该类的方法信息。

  导入Java . lang . reflect . method;

  公共类转储方法

  {

  public static void main(string[]args)抛出异常//在方法后面加上这句话,异常消失。

  {

  //获取由字符串标识的类的类对象

  班级?class type=class . forname( Java . lang . string );//这里传入一个字符串指定类名,所以参数获取可以是运行时行为,可以使用args[0]。

  //返回与类对象对应的类或接口中所有声明的方法(包括私有方法)的数组

  method[]methods=class type . getdeclaredmethods();

  //遍历并输出所有方法声明

  for(方法方法:方法)

  {

  System.out.println(方法);

  }

  }

  }例程2:通过反射调用方法

  通过反射调用方法。有关详细信息,请参见代码和注释:

  导入Java . lang . reflect . method;

  公共类InvokeTester

  {

  public int add(int param1,int param2)

  {

  返回param1 param2

  }

  公共字符串回应(字符串消息)

  {

  返回“你好:”消息;

  }

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

  {

  //以前的常规执行手段

  invoke tester tester=new invoke tester();

  system . out . println(tester . add(1,2));

  system . out . println(tester . echo( Tom ));

  system . out . println(-);

  //通过反射的方式

  //第一步,获取类对象

  //前面的方法是:Class.forName()方法获取

  //这里用第二个方法,类名。班级

  班级?class type=invoke tester . class;

  //生成新对象:使用newInstance()方法

  object invoke tester=class type . new instance();

  system . out . println(invoke tester instance of invoke tester);//输出true

  //通过反射调用方法

  //首先需要获取这个方法对应的方法对象。

  方法add method=Class type . get method( add ,new Class[] { int.class,

  int . class });

  //第一个参数是方法名,第二个参数是该方法所需参数的类对象数组。

  //调用目标方法

  Object result=add method . invoke(invoke tester,new Object[] { 1,2 });

  System.out.println(结果);//此时,结果是整数类型

  //调用第二个方法

  方法echo method=Class type . getdeclaredmethod( echo ,new Class[]{ string . Class });

  Object result 2=echo method . invoke(invoke tester,new Object[]{ Tom });

  system . out . println(result 2);

  }

  }

生成对象

  如果你想通过类的无参数构造方法生成一个对象,我们有两种方法:

  1.先获取类对象,然后通过类对象的newInstance()方法直接生成:

  班级?classType=String.class

  object obj=class type . new instance();2.先获取类对象,然后通过这个对象获取对应的构造函数对象,再通过这个构造函数对象的newInstance()方法生成。

  (其中Customer是自定义类,有一个不带参数的构造方法和一个带参数的构造方法):

  班级?classType=Customer.class

  //获取构造函数对象,这里获取第一个无参数构造函数的。

  constructor cons=Class type . get constructor(new Class[]{ });

  //通过构造方法生成对象

  Object obj=cons . new instance(new Object[]{ });如果要通过类的参数化构造方法生成对象,只能使用以下方法:

  (Customer是自定义类,有带参数的也有不带参数的构造方法,也有带参数的构造方法,传入的是字符串和整数。)

  班级?classType=Customer.class

  constructor con S2=Class type . get constructor(new Class[]{ string . Class,int . Class });

  Object obj 2=con S2 . new instance(new Object[]{ 张三,20 });可以看出,调用构造方法生成对象的方法类似于调用一般方法。区别在于从类对象获取构造函数对象时不需要指定名称,而在获取方法对象时需要指定名称。

  相关视频教程推荐:java视频教程以上是Java中什么是反射的详细内容。更多请关注我们的其他相关文章!

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

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