反射机制(reflection)
一、反射:
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)的更多相关文章
- Java - 反射机制(Reflection)
Java - 反射机制(Reflection) > Reflection 是被视为 动态语言的关键,反射机制允许程序在执行期借助于 Reflection API 取得任何类的 ...
- java反射机制--reflection
反射,reflection,听其名就像照镜子一样,可以看见自己也可以看见别人的每一部分.在java语言中这是一个很重要的特性.下面是来自sun公司官网关于反射的介绍: Reflection is ...
- JAVA动态性之一一反射机制reflection
package com.bjsxt.reflection.test.bean; public class User { private int id; private int age; private ...
- Java反射机制Reflection
Java反射机制 1 .class文件 2 Class类 3 Class类与反射机制 4 Java反射机制的类库支持及简介 5 反射机制的定义与应用 6 反射机制Demo Java反射机制demo(一 ...
- Java中的反射机制Reflection
目录 什么是反射? 获取.class字节码文件对象 获取该.class字节码文件对象的详细信息 通过反射机制执行函数 反射链 反射机制是java的一个非常重要的机制,一些著名的应用框架都使用了此机制, ...
- PHP 反射机制Reflection
简介 PHP Reflection API是PHP5才有的新功能,它是用来导出或提取出关于类.方法.属性.参数等的详细信息,包括注释. class Reflection { } interface R ...
- as与c++的反射机制对比
所谓反射机制(Reflection),简单来说,就是可以根据class的名称获取这个class以及其对应的实例.具体来说, 指的是我们可以于运行时加载.探知.使用编译期间完全未知的classes.换句 ...
- Java动态性之--反射机制
1. 动态语言 程序运行时,可以改变结构或变量类型.典型的语言: Python.ruby.javascript等 如下javascript代码 function test(){ var s = &qu ...
- Java 反射机制(一)
阅读<Core Java Volume I --- Fundamentals>反射部分,总觉得许多概念艰涩难懂.模棱两可.我想造成这个结果的主要原因可能是Cay S. Horstmann和 ...
- Java进阶之reflection(反射机制)——反射概念与基础
反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见 ...
随机推荐
- NOI2.5 1817:城堡问题
描述 1 2 3 4 5 6 7 ############################# 1 # | # | # | | # #####---#####---#---#####---# 2 # # ...
- RainbowPlan-Alpha版本发布2
博客介绍 这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/GeographicInformationScience/ 这个作业要求在哪里 https:// ...
- OpenCV2.4.13+Qt5.6.2配置方法
[1.环境变量] D:\Soft\OpenCV2\MinGW_build\bin; C:\Qt\Qt5.6.2\Tools\mingw492_32\bin; D:\Soft\Programming\C ...
- Spring Cloud服务注册中心交付至kubernetes
前言 服务发现原则: 各个微服务在启动时,会将自己的网络地址等信息注册到服务发现组件中,服务发现组件会存储这些信息 服务消费者可以从服务发现组件中查询到服务提供者的网络地址,并使用该地址来远程调用服务 ...
- shiro 基础使用
引 言 相关内容 : https://blog.csdn.net/superyayaya/article/details/94408805 在web 中, 不同角色的用户, 具有不同的访问权限, 有的 ...
- zabbix3.4搭建微信报警
身为小白的我在历经被百度查到的资料坑了无数次之后,终于找到了一个正确的文档,下面是我自己的对于安装过程的理解与阐述. 一.申请微信企业号,获取以下数据. 企业ID:(在我们企业最下方可以看到) 应用的 ...
- 最大似然估计、n阶矩、协方差(矩阵)、(多元)高斯分布 学习摘要
最大似然估计 似然与概率 在统计学中,似然函数(likelihood function,通常简写为likelihood,似然)和概率(Probability)是两个不同的概念.概率是在特定环境下某件事 ...
- ubuntu 如何搭建svn 服务器
1.在终端中直接输入 sudo apt-get install subversion,选择安装即可 来这个subversion同时包含了服务端和客户端. 2.(可选)看版本命令 svnserve - ...
- HDU_3415_单调队列
http://acm.hdu.edu.cn/showproblem.php?pid=3415 初探单调队列,需要注意的是每次i维护的是i-1. #include<iostream> #in ...
- 在form子句中使用子查询时的注意事项
今天中午为了弄清这个问题,本人真的是头都搞大了!最后明白了一点,在from子句中使用子查询是,一定要将临时表的别名带上,否则会灰常痛苦!!!