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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。