java反射机制示例详解

时间:2021-08-07 07:51:59 

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));

}

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

标签:java,反射
0
投稿

猜你喜欢

  • 一口气说出Java 6种延时队列的实现方法(面试官也得服)

    2022-12-15 16:40:12
  • C#操作XML文件实例汇总

    2023-03-26 03:55:08
  • Java 异常的栈轨迹(Stack Trace)详解及实例代码

    2023-12-13 12:19:02
  • SpringBoot实战之SSL配置详解

    2022-08-03 19:38:17
  • C#推送信息到APNs的方法

    2023-05-29 05:20:59
  • java nio基础使用示例

    2022-02-12 01:46:22
  • 解决RestTemplate第一次请求响应速度较慢的问题

    2021-10-20 15:50:50
  • SpringCloudConfig之client端报错Could not resolve placeholder问题

    2023-11-23 11:19:17
  • Java String、StringBuffer与StringBuilder的区别

    2022-08-29 23:29:55
  • SpringBoot如何使用RateLimiter通过AOP方式进行限流

    2023-09-16 18:18:44
  • Java中String类的常用方法总结

    2021-11-26 10:39:20
  • JDBC+GUI实现简单学生管理系统

    2022-08-21 02:52:00
  • Spring源码解析 Bean属性填充

    2021-06-28 19:17:16
  • Java经典面试题最全汇总208道(四)

    2023-11-08 23:59:26
  • 读写Android中assets目录下的文件的方法详解

    2023-03-03 15:50:35
  • 基于JDK8总结java中的interrupt

    2021-12-27 07:43:54
  • 利用@Value注解为bean的属性赋值方法总结

    2023-10-15 19:54:06
  • C#采用FileSystemWatcher实现监视磁盘文件变更的方法

    2023-12-10 02:52:49
  • MyBatis传入参数为List对象的实现

    2021-12-14 20:16:06
  • 详解Java中restTemplate的使用

    2023-06-19 23:20:29
  • asp之家 软件编程 m.aspxhome.com