一、什么是JAVA的反射

1、在运行状态中,对于任意一个类,都能够知道这个类的属性和方法。

2、对于任意一个对象,都能够调用它的任何方法和属性。

这种动态获取信息以及动态调用对象的方法的功能称为JAVA的反射。

二、反射的作用

在JAVA中,只有给定类的名字,就可以通过反射机制来获取类的所有信息,可以动态的创建对象和编译。

三、反射的原理

JAVA语言编译之后会生成一个.class文件,反射就是通过字节码文件找到某一个类、类中的方法以及属性等。

反射的实现主要借助以下四个类:

Class:类的对象

Constructor:类的构造方法

Field:类中的属性对象

Method:类中的方法对象

1、获取类对象:

通过类名获取Class对象,Class<T> c = Class.forName("类的完全路径");

通过Class对象获取具体的类对象:Object o = (Object) c.newInstance();

2、获取类中的构造方法:

3、获取类中的属性:

4、获取类中的方法:

四、代码演示

 package reflection;

 import java.io.Serializable;

 public class DemoTest implements Serializable
{
/**
* 注释内容
*/
private static final long serialVersionUID = 1L; public String name;
public int age; public DemoTest()
{
} public DemoTest(String name, int age)
{
this.name = name;
this.age = age;
} public void sayHello(String param)
{
System.out.println("hello " + param);
} public String getName()
{
return name;
} public void setName(String name)
{
this.name = name;
} public int getAge()
{
return age;
} public void setAge(int age)
{
this.age = age;
}
}

测试类:

 package reflection;

 import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method; public class Test
{
public static void main(String[] args) throws Exception
{
//获取类DemoTest的Class对象
Class<?> c = Class.forName("reflection.DemoTest");
//打印该Class对象对表示的类的名称
System.out.println(c.getName());
//获取该类的实例
System.out.println(c.newInstance()); System.out.println("-------------------------------------------");
//获取该类实现的接口
Class<?>[] interfaces = c.getInterfaces();
System.out.println(interfaces[0].getName()); System.out.println("-------------------------------------------");
//获取有参构造函数
Constructor<?> con = c.getConstructor(String.class,int.class);
DemoTest dt = (DemoTest)con.newInstance("xiaoming",12);
System.out.println(dt.getAge()); System.out.println("-------------------------------------------");
//获取类的成员变量
Field f2 = c.getField("age");
System.out.println(f2);
//获取指定对象上该字段表示的值
System.out.println(f2.get(dt)); System.out.println("-------------------------------------------");
//获取指定的方法
Method m = c.getMethod("sayHello", String.class);
//反射调用方法,非常重要
40 m.invoke(dt, "hangzhou");
}
}

测试结果:

reflection.DemoTest
reflection.DemoTest@15db9742
-------------------------------------------
java.io.Serializable
-------------------------------------------
12
-------------------------------------------
public int reflection.DemoTest.age
12
-------------------------------------------
hello hangzhou

最新文章

  1. 【原】SDWebImage源码阅读(五)
  2. spring项目部署到resin4中的无法注入问题
  3. IKONS – 赞!264 款手工打造的免费矢量图标
  4. 利用SQL注入漏洞登录后台的实现方法 。。。。转载
  5. Java判断访问设备为手机、微信、PC工具类
  6. CSS等高布局
  7. Xcode注释插件 VVDocumenter 升级Xcode6.x 失效的解决办法
  8. wpfのuri(让你完全明白wpf的图片加载方式以及URI写法)
  9. BZOJ 1854: [Scoi2010]游戏 无向图判环
  10. SCAU 1138 代码等式
  11. Qt xcode wrapper Qios OpenFly
  12. HDOJ迷宫城堡(判断强连通 tarjan算法)
  13. java开发webservice
  14. 关于cvScalar的那些事
  15. CSS 实现图片灰度效果 兼容各种浏览器
  16. POJ 2676 Sudoku(深搜)
  17. js 判断是否为数组的方式 及 类数组转换成数组格式
  18. Mysql更新关联子查询报错
  19. Jenkins2.32打包Unity项目的记录
  20. JS数组迭代方法

热门文章

  1. C++中的输入参考
  2. Word常用实用知识2
  3. android 获取适配的bitmap等相关
  4. 消息队列NetMQ 原理分析2-IO线程和完成端口
  5. 机器学习实战笔记(1)——k-近邻算法
  6. 浅谈Django的Q查询以及AngularJS的Datatables分页插件
  7. Oracle VS DB2 数据类型
  8. JS闭包深入理解(理解篇)
  9. CentOS 6.4 升级python 2.6.6 到 python 2.7.9
  10. DirectX11中Shader的封装