欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java反射机制示例详解

程序员文章站 2024-02-20 20:24:04
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));

}

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