一、反射:

1、反射指可以在运行时加载、探知、使用编译期间完全未知的类。

2、程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个已加载的类,都能够知道这个类的所有属性和方法;

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

3、加载完类后,在堆内存中产生一个Class类型的对象(一个类只有一个Class对象),这个对象包含完整的类的结构信息。

通过这个对象看到类的结构。这个对象就像一面镜子,透过镜子看到类的结构,称之为:反射。


二、作用

1、动态加载类、动态获取类信息(属性、方法、构造器)

2、动态构造对象

3、动态调用类和对象的任意方法、构造器

4、动态调用和处理属性

5、获取泛型信息

6、处理注解


三、Class类对象

getClass() 、 Class.forName() 、 .class 语法

public class Demo01 {

	public static void main(String[] args) {
String path = "cn.lhl.Test.bean.User"; try {
Class clazz = Class.forName(path);
//对象是表示和封装一些数据。
//一个类被加载后,JVM会创建一个对应的Class对象,类的全部结构会放到对应的Class对象中。
//通过Class看到对应类的信息
System.out.println(clazz); Class clazz1 = String.class;
Class clazz2 = int.class; Class clazz3 = path.getClass(); } catch (Exception e) {
e.printStackTrace();
} }
}

  

三、操作,获取类信息


package cn.lhl.Test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method; /**
*通过反射的API ,获取类的信息
*
* @author Administrator
*
*/
public class Demo02 {
public static void main(String[] args) {
String path = "cn.lhl.Test.bean.User"; try {
Class clazz = Class.forName(path); //获取类的名字
System.out.println(clazz.getName());//包名和类名
System.out.println(clazz.getSimpleName());//类名 //获取属性信息
// Field[] fields = clazz.getFields();//只能获得public的field
Field[] fields = clazz.getDeclaredFields();//获得所有的field
Field f = clazz.getDeclaredField("uname");
System.out.println(fields.length);
for(Field temp:fields) {
System.out.println(temp);
} //获取方法信息
Method[] methods = clazz.getDeclaredMethods();
Method m01 = clazz.getDeclaredMethod("getUname", null);
Method m02 = clazz.getDeclaredMethod("setUname", String.class);//如果有参,必须传递参试类型对应的class对象
for(Method m:methods) {
System.out.println(m);
} //获取构造器信息
Constructor[] constructors = clazz.getDeclaredConstructors();//所有构造
Constructor c = clazz.getDeclaredConstructor(null);//空构造
Constructor c1 = clazz.getDeclaredConstructor(int.class,int.class,String.class);//有参构造
for(Constructor temp:constructors) {
System.out.println(temp);
} } catch (Exception e) {
e.printStackTrace();
} } }

  


package cn.lhl.Test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method; import cn.lhl.Test.bean.User; /**
*通过反射API动态操作:构造器、方法、属性
* @author Administrator
*
*/
public class Demo03 {
public static void main(String[] args) {
String path = "cn.lhl.Test.bean.User"; try {
Class<User> clazz = (Class<User>) Class.forName(path); //通过反射API调用构造方法,构造对象
User u = clazz.newInstance(); //调用了User无参构造方法
System.out.println(u); Constructor<User> c = clazz.getDeclaredConstructor(int.class,int.class,String.class);
User u1 = c.newInstance(100,18,"华哥");
System.out.println(u1.getUname()); //通过反射API调用普通方法
User u2 = clazz.newInstance();
Method method = clazz.getDeclaredMethod("setUname",String.class);
method.invoke(u2, "华哥二");
System.out.println(u2.getUname()); //通过反射API操作属性
User u3 = clazz.newInstance();
Field f = clazz.getDeclaredField("uname");
f.setAccessible(true); //这个属性不需要安全检查,可以直接访问,可以提高效率(大概为4倍)
f.set(u3, "华哥三"); //通过反射直接写属性
System.out.println(u3.getUname());//通过反射直接读取属性的值
System.out.println(f.get(u3)); } catch (Exception e) {
e.printStackTrace();
} }
}

反射机制(reflection)的更多相关文章

  1. Java - 反射机制(Reflection)

    Java - 反射机制(Reflection)     > Reflection 是被视为 动态语言的关键,反射机制允许程序在执行期借助于 Reflection API 取得任何类的       ...

  2. java反射机制--reflection

    反射,reflection,听其名就像照镜子一样,可以看见自己也可以看见别人的每一部分.在java语言中这是一个很重要的特性.下面是来自sun公司官网关于反射的介绍:    Reflection is ...

  3. JAVA动态性之一一反射机制reflection

    package com.bjsxt.reflection.test.bean; public class User { private int id; private int age; private ...

  4. Java反射机制Reflection

    Java反射机制 1 .class文件 2 Class类 3 Class类与反射机制 4 Java反射机制的类库支持及简介 5 反射机制的定义与应用 6 反射机制Demo Java反射机制demo(一 ...

  5. Java中的反射机制Reflection

    目录 什么是反射? 获取.class字节码文件对象 获取该.class字节码文件对象的详细信息 通过反射机制执行函数 反射链 反射机制是java的一个非常重要的机制,一些著名的应用框架都使用了此机制, ...

  6. PHP 反射机制Reflection

    简介 PHP Reflection API是PHP5才有的新功能,它是用来导出或提取出关于类.方法.属性.参数等的详细信息,包括注释. class Reflection { } interface R ...

  7. as与c++的反射机制对比

    所谓反射机制(Reflection),简单来说,就是可以根据class的名称获取这个class以及其对应的实例.具体来说, 指的是我们可以于运行时加载.探知.使用编译期间完全未知的classes.换句 ...

  8. Java动态性之--反射机制

    1. 动态语言 程序运行时,可以改变结构或变量类型.典型的语言: Python.ruby.javascript等 如下javascript代码 function test(){ var s = &qu ...

  9. Java 反射机制(一)

    阅读<Core Java Volume I --- Fundamentals>反射部分,总觉得许多概念艰涩难懂.模棱两可.我想造成这个结果的主要原因可能是Cay S. Horstmann和 ...

  10. Java进阶之reflection(反射机制)——反射概念与基础

    反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见 ...

随机推荐

  1. kuangbin专题专题十一 网络流 POJ 1087 A Plug for UNIX

    题目链接:https://vjudge.net/problem/POJ-1087 题目:有n个插座,插座上只有一个插孔,有m个用电器,每个用电器都有插头,它们的插头可以一样, 有k个插孔转化器, a ...

  2. 用CSS实现横向滚动条

    在进行app制作时,需要使用横向滚动条是内容展示更完善 首先,这是html代码: 这是CSS代码: 要点: 设置显示内容的宽 white-space是防止内容自动折行 overflow-y设置为hid ...

  3. java获取本地IP地址集合包括虚拟机的ip

    public static ArrayList<String> getLocalIpAddr() { ArrayList<String> ipList = new ArrayL ...

  4. IDEA | Dot Executable: null..No dot executable found

    背景 今天想在IDEA上打开.puml后缀的类图,发现IDEA并不能识别,但是正常的时序图却能正常打开,打开类图就报如下错误: 解决方案 经排查,idea的plantuml插件默认只支持时序图,类图还 ...

  5. 微信小程序 客户端时间 与 服务端时间

    服务端时间 db.serverDate(); 在操作数据库,上传数据的时候可以使用服务端时间 wx.cloud.init();//初始化云 const db = wx.cloud.database() ...

  6. python+selenium爬取百度文库不能下载的word文档

    有些时候我们需要用到百度文库的某些文章时,却发现需要会员才能下载,很难受,其实我们可以通过爬虫的方式来获取到我们所需要的文本. 工具:python3.7+selenium+任意一款编辑器 前期准备:可 ...

  7. Nginx之keepalived高可用工具

    1.创建两台虚拟机,分别为主机和从机,区别两台虚拟机的IP地址 2. 将keepalived上传到linux系统当中 3. cd /usr/local目录 4. tar -zxvf keepalive ...

  8. 红帽(RedHat8) RHEL8.0系统安装教程(小白都会)

    可以去了解一下Red Hat8产品详情:https://www.RedHat.com/zh/enterprise-linux-8 先准备VMware Workstation 15 Pro版本,Red ...

  9. 引入Activiti配置文件activiti.cfg.xml

    前面我们用代码实现了生成25张activiti表,今天我们用Activiti提供的activiti.cfg.xml配置文件来简化实现前面的功能: 官方文档参考地址:http://activiti.or ...

  10. 牛客练习赛25 A 因数个数和(数论分块)

    题意: q次询问,每次给一个x,问1到x的因数个数的和. 1<=q<=10 ,1<= x<=10^9 1s 思路: 对1~n中的每个数i,i作为i,2i,3i,...的约数,一 ...