简述java反射机制,java中的反射机制使用
本文通过java编程入门专栏详细介绍了java中的反射机制,希望能帮助到对这一机制一无所知的同学。
java反射
在机制的运行状态下,可以知道任何类的所有属性和方法(包括私有的);对于任何对象,都可以调用它的任何方法和属性;这种动态获取信息,动态调用对象方法的功能被称为Java反射机制。
用途:
确定任何对象在运行时所属的类。
在运行时构造任何类的对象。
在运行时判断任何类的成员变量和方法。
在运行时调用任何对象的方法。
生成动态代理。
反射相关的类
如何解决写爬虫IP受阻的问题?立即使用。
class类
通常有三种方法可以在Java程序中获得类对象:
1.使用类的forName(String clazzName)的静态方法。此方法需要一个字符串参数,其值是类的完全限定名(必须添加完整的包名)。
2.调用某个类的Class属性,获取该类对应的类对象。
3.调用对象的getClass()方法。该方法是java.lang.Object类中的方法。
Field
field[]all fields=class 2 . getdeclaredfields();//获取类对象的所有属性
field[]public fields=class 2 . get fields();//获取类对象的公共属性
field age field=class 2 . getdeclaredfield( age );//获取class指定的属性,可以获取私有属性。
field des field=class 2 . getfield( des );//获取类指定的公共属性Method
method[]methods=class 2 . getdeclaredmethods();//获取类对象的所有声明方法
method[]all methods=class 2 . get methods();//获取类对象的所有公共方法,包括父类的方法
method method=class 2 . get method( info ,string . class);//返回带有指定参数列表的二级类对象对应类的公共方法。
method declared method=class 2 . getdeclaredmethod( info ,string . class);//返回,
用参数列表Constructor指定方法
建造师?[]all constructors=class 2 . getdeclaredconstructors();//获取类对象的所有声明的构造函数
建造师?[]public constructors=class 2 . get constructors();//获取类对象的公共构造函数
建造师?constructor=class 2 . getdeclaredconstructor(string . class);//获取指定声明的构造函数
构造函数public constructor=class 2 . get constructor(string . class);//获取指定声明的公共构造函数通过反射 生成实例对象
1.使用类对象的newInstance()方法创建类对象的相应类的实例。这个方法要求类对象对应的类有一个默认的构造函数,在执行newInstance()方法时,默认的构造函数实际上是用来创建类的一个实例。
2.先用Class对象获取指定的Constructor对象,然后调用Constructor对象的newInstance()方法创建Class对象对应类的实例。这样,您可以选择使用指定的构造函数来创建实例。
调用方法
1.通过类对象的getMethods()方法或getMethod()方法获取指定的方法,返回方法数组或对象。
2.调用方法对象中的ObjectInvoke (Objectobj,object … args)方法。第一个参数对应于调用此方法的实例对象,第二个参数对应于此方法的参数。
示例代码:
反射是什么?
包am;
导入Java . lang . reflect . constructor;
导入Java . lang . reflect . field;
导入Java . lang . reflect . method;
导入Java . util . arrays;
导入javax . activation . file data source;
/**
*反射是什么:
* Java中的反射:即在类加载的过程中,发现类属性、方法构造方法等信息。您可以获取类的属性值并调用类的方法。
*
*
* Reflect获取该类的对象。
*
*/
公共类演示01 {
公共静态void main(String[] args)引发异常{
//通过反射获取类的对象。
Object obj=create(am。foo’);
Foo Foo=(Foo)obj;
system . out . println(foo . a);
double dou=foo.show(12,你好);
system . out . println(dou);
系统。出去。println(============================);
//获得类的属性
showField(obj);
系统。出去。println(============================);
double a=(double)get field value(obj, b );
系统。出去。println(a);
系统。出去。println(============================);
//通过反射调用方法。
Object ob=getMethodValue(obj, show ,new Class[]{int.class,String.class},new Object[]{23, ABC });
double dou值=(double)ob;
系统。出去。println(dou值);
}
//通过反射调用方法,哪个对象,什么名称,参数类型,参数值
公共静态对象getMethodValue(对象对象,字符串方法,类[]参数类型,对象[]参数)
引发异常{
class cla=obj。getclass();
方法me=cla。getdeclaredmethod(方法,参数类型);
Object o=me.invoke(obj,param);
返回o;
}
//获取类的属性值:
公共静态对象获取字段值(对象对象,字符串名称)引发异常{
class cla=obj。getclass();//获取字节码对象。
field field=cla。getdeclaredfield(名称);//通过属性的名称。获取当前属性。
对象结果=字段。get(obj);
返回结果;
}
//通过反射,可以获得类的属性信息以及方法信息。
公共静态void showField(对象对象){
//java中对属性类100 .字段方法类:方法
class cla=obj。getclass();
System.out.println(获取类名:中情局。getname());
系统。出去。println(============================);
//获取类的属性:
字段[]字段=cla。getdeclaredfields();//获取公开的属性。
对于(字段字段:字段){
System.out.println(获取类的属性类型字段。gettype());
System.out.println(获取类的属性名称:字段。getname());
}
系统。出去。println(============================);
//获取类的方法。
方法[]方法=cla。getdeclaredmethods();
对于(方法方法:方法){
System.out.println(获取方法的返回值类型:方法。get returntype());
System.out.println(获取方法名称:方法。getname());
System.out.println(获取方法的参数类型数组。tostring(方法。getparametertypes()));
}
系统。出去。println(============================);
//获取类的构造方法:
构造函数[]cons=cla。getdeclaredconstructors();
对于(构造函数利弊){
System.out.println(构造方法的名字: con . getname());
System.out.println(构造方法参数类型:数组。tostring(con . getparametertypes()));
}
}
//如何反射类的实例。
公共静态对象创建(字符串名称)引发异常{
//反射的方法班级。forname();
class cla=class。forname(姓名);
//如何获得目标类型对象。
object obj=cla。新实例();
返回目标文件
}
}
//模拟类。
富(中国姓氏)类
int a=10
双b=20
public double show(int p,String str){
System.out.println(调用方法传入的值是: str);
返回一个b p;
}
公共Foo(){
}
public Foo(int a,int b){
}
}更多相关学习视频推荐:java视频教程以上就是对于爪哇岛反射机制的详细介绍的详细内容,更多请关注我们其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。