java反射機制示例詳解
1.什么是反射?
一個類有多個組成部分,例如:成員變量,方法,構(gòu)造方法等。
反射就是加載類,并解剖出類的各個組成部分。
2.加載類
java中有一個Class類用于代表某一個類的字節(jié)碼。
Class類既然代表某個類的字節(jié)碼,那就要提供加載某個類
字節(jié)碼的方法:forName(). 此方法用于加載某個類的字節(jié)碼
到內(nèi)存中,并使用class對象進行封裝。
另外2種得到class對象的方式:
類名.class
對象.getClass()
先創(chuàng)建一個簡單的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.反射構(gòu)造方法
Person類中:
/**
*構(gòu)造方法
*/
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);//獲取構(gòu)造器對象
Personp=(Person)cr.newInstance(null);//通過構(gòu)造器實例化對象
//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);
}
//另一種創(chuàng)建對象的途徑,只適用于無參的構(gòu)造方法
@Test
publicvoidtest5()throwsException{
Classclazz=Class.forName("RflectorDemo.Person");
Personp=(Person)clazz.newInstance();
System.out.println(p.name);
}
4.反射常規(guī)方法
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);
}
//設(shè)置字段的值
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));
}
其實無論反射構(gòu)造方法,或者字段都大致相同,我們可以舉一反三!
相關(guān)文章
Java編程實現(xiàn)beta分布的采樣或抽樣實例代碼
這篇文章主要介紹了Java編程實現(xiàn)beta分布的采樣或抽樣實例,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-01-01Java 實現(xiàn)多線程切換等待喚醒交替打印奇偶數(shù)
這篇文章主要介紹了Java 實現(xiàn)多線程切換等待喚醒交替打印奇偶數(shù) ,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-05-05深入了解Java中循環(huán)結(jié)構(gòu)的使用
Java中有三種主要的循環(huán)結(jié)構(gòu):while 循環(huán)、do…while 循環(huán)和for 循環(huán)。本文將來和大家一起講講Java中這三個循環(huán)的使用,需要的可以參考一下2022-08-08idea運行tomcat報錯找不到catalina.bat,系統(tǒng)找不到指定的文件問題
這篇文章主要介紹了idea運行tomcat報錯找不到catalina.bat,系統(tǒng)找不到指定的文件問題,具有很好的參考價值,希望對大家有所幫助,2023-11-11