当前位置: 移动技术网 > IT编程>开发语言>Java > java反射机制示例详解

java反射机制示例详解

2019年07月22日  | 移动技术网IT编程  | 我要评论
1.什么是反射?一个类有多个组成部分,例如:成员变量,方法,构造方法等。反射就是加载类,并解剖出类的各个组成部分。2.加载类java中有一个class类用于代表某一个类的字

1.什么是反射?
一个类有多个组成部分,例如:成员变量,方法,构造方法等。
反射就是加载类,并解剖出类的各个组成部分。

2.加载类
java中有一个class类用于代表某一个类的字节码。
class类既然代表某个类的字节码,那就要提供加载某个类
字节码的方法:forname().   此方法用于加载某个类的字节码
到内存中,并使用class对象进行封装。
另外2种得到class对象的方式:
类名.class
对象.getclass()

先创建一个简单的person类

复制代码 代码如下:

public class reflectdemo { 
public static void main(string args[]) throws exception 
{  //1. 
 class clazz = class.forname("dsa.person") ; 

//2. 
class clazz1 = new person().getclass() ; 

//3. 
classclazz2=person.class;
}
}

3.反射构造方法

person类中:

复制代码 代码如下:

/**
*构造方法
*/
publicperson(){
system.out.println("null");
}

publicperson(stringname){
system.out.println(name);
}

publicperson(stringname,intpwd){
system.out.println(name+"+"+pwd);
}

privateperson(listlist){
system.out.println("list");
}

测试类中:

复制代码 代码如下:

//反射publicperson()
@test
publicvoidtest1()throwsexception{
classclazz=class.forname("rflectordemo.person");
constructorcr=clazz.getconstructor(null);//获取构造器对象
personp=(person)cr.newinstance(null);//通过构造器实例化对象
//system.out.println(p.name);
}

//反射publicperson(stringname)
@test
publicvoidtest2()throwsexception{
classclazz=class.forname("rflectordemo.person");
constructorcr=clazz.getconstructor(string.class);
personp=(person)cr.newinstance("haha");
system.out.println(p.name);
}

//反射publicperson(stringname,intpwd)
@test
publicvoidtest3()throwsexception{
classclazz=class.forname("rflectordemo.person");
constructorcr=clazz.getconstructor(string.class,int.class);
personp=(person)cr.newinstance("haha",1);
//system.out.println(p.name);
}

//反射publicperson(listlist)
@test
publicvoidtest4()throwsexception{
classclazz=class.forname("rflectordemo.person");
constructorcr=clazz.getdeclaredconstructor(list.class);
cr.setaccessible(true);//暴力破解
personp=(person)cr.newinstance(newarraylist());
system.out.println(p.name);
}
//另一种创建对象的途径,只适用于无参的构造方法
@test
publicvoidtest5()throwsexception{
classclazz=class.forname("rflectordemo.person");

personp=(person)clazz.newinstance();
system.out.println(p.name);
}

当构造方法是私有的,我们就进行暴力破解!!!

4.反射常规方法

person类中:

复制代码 代码如下:

/**
*方法
*/
publicvoidjf()
{

}
publicvoidjf(stringname,intpwd)
{

}
publicclass[]jf(stringname,int[]pwd)
{
returnnewclass[]{string.class,int.class};
}
privatevoidjf(inputstreamin)
{
system.out.println(in);
}
publicstaticvoidjf(intnum)
{
system.out.println(num);
}
publicstaticvoidmain(stringargs[])
{
system.out.println("main!!!");
}


测试类中:
复制代码 代码如下:

/**
*反射类的方法
*
*@authortanlvxu
*
*/
publicclassdemo2{

//反射类的方法:publicvoidjf()
@test
publicvoidtest1()throwsexception{
personp=newperson();
classclazz=class.forname("rflectordemo.person");
methodmethod=clazz.getmethod("jf",null);
method.invoke(p,null);
}

//反射类的方法:publicvoidjf(stringname,intpwd)
@test
publicvoidtest2()throwsexception{
personp=newperson();
classclazz=class.forname("rflectordemo.person");
methodmethod=clazz.getmethod("jf",string.class,int.class);
method.invoke(p,"dsa",30);
}

//反射类的方法:publicclass[]jf(stringname,int[]pwd)
@test
publicvoidtest3()throwsexception{
personp=newperson();
classclazz=class.forname("rflectordemo.person");
methodmethod=clazz.getmethod("jf",string.class,int[].class);
classcs[]=(class[])method.invoke(p,"aads",newint[]{1,2,3});
system.out.println(cs[0]);
}

//反射类的方法:privatevoidjf(inputstreamin)
@test
publicvoidtest4()throwsexception{
personp=newperson();
classclazz=class.forname("rflectordemo.person");
methodmethod=clazz.getdeclaredmethod("jf",inputstream.class);
method.setaccessible(true);
method.invoke(p,newfileinputstream("d:\\qqclient.txt"));
}

//反射类的方法:publicstaticvoidjf(intnum)
@test
publicvoidtest5()throwsexception{
classclazz=class.forname("rflectordemo.person");
methodmethod=clazz.getmethod("jf",int.class);
method.invoke(null,30);
}

//反射类的方法:publicstaticvoidm(intnum)
@test
publicvoidtest6()throwsexception{
classclazz=class.forname("rflectordemo.person");
methodmethod=clazz.getmethod("main",string[].class);
//method.invoke(null,(object)newstring[]{"ds","das"});
method.invoke(null,newobject[]{newstring[]{"ds","das"}});
}


5.反射字段

person类中:

复制代码 代码如下:

/**
*字段
*/
publicstringname="swr";
privateintpassword=45;
privatestaticintage=35;
测试类中:

java代码
/**
*反射类的字段
*@authortanlvxu
*
*/
publicclassdemo3{
/**
*反射字段publicstringname="swr";
*@throwsexception
*/
@test
publicvoidtest1()throwsexception
{
personp=newperson();
classclazz=class.forname("rflectordemo.person");
fieldf=clazz.getfield("name");
//获取字段的值
objectvalue=f.get(p);
//获取字段的类型
classtype=f.gettype();
if(type.equals(string.class)){
stringname=(string)f.get(p);
system.out.println(name);
}

//设置字段的值
f.set(p,"dfafa");
system.out.println(p.name);

}

/**
*反射字段privateintpassword;
*@throwsexception
*/
@test
publicvoidtest2()throwsexception
{
personp=newperson();
classclazz=class.forname("rflectordemo.person");
fieldf=clazz.getdeclaredfield("password");
f.setaccessible(true);
f.set(p,36);
system.out.println(f.get(p));

}

/**
*反射字段privatestaticintage=35;
*@throwsexception
*/
@test
publicvoidtest3()throwsexception
{
classclazz=class.forname("rflectordemo.person");
fieldf=clazz.getdeclaredfield("age");
f.setaccessible(true);
f.set(null,24);
system.out.println(f.get(null));

}

其实无论反射构造方法,或者字段都大致相同,我们可以举一反三!

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网