反射机制(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动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见 ...
随机推荐
- python,for循环的使用案例集
1.循环执行某一系列操作.将该操作定义为一个def,然后使用for去循环执行该操作 思路,先把操作定义为一个函数,在for循环执行这个函数 比如下面案例,把微信好友列表内的好友,循环的方式依次调整到第 ...
- Python3基础之初识Python
Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序, 作为ABC语 ...
- SpringCloud与微服务Ⅶ --- Feign负载均衡
官方文档:https://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-feign 一.Feign是什么 Feign是一 ...
- TypeScript躬行记(6)——高级类型
本节将对TypeScript中类型的高级特性做详细讲解,包括交叉类型.类型别名.类型保护等. 一.交叉类型 交叉类型(Intersection Type)是将多个类型通过“&”符号合并成一个新 ...
- 3.部署场景1:带有遗留的Open vSwitch
部署场景1:带有遗留的Open vSwitch 此场景描述了使用带有Open vSwitch(OVS)的ML2插件的OpenStack网络服务的(基本)实现. 遗留的实现通过为普通用户提供一种方法来管 ...
- keywords in my life
在脑子里出现的灵光一现的话语总是美好的: 1.当你试图站在人的发展,历史的发展的角度上看待问题,会发现我们身上所发生的任何事情都是必然的. 2.永远不要以好人的身份去看待和分析一件事情. 3.历史悲剧 ...
- XDOJ
1000.a+b. #include<bits/stdc++.h> using namespace std; int a,b; int main() { ios::sync_with_st ...
- CCF_ 201512-3_画图
直接模拟就行了,注意坐标系方向与平常数组不一样,填充操作用深搜和广搜都可以,这里用了广搜. #include<iostream> #include<cstdio> #inclu ...
- Linux密码策略--设置随机密码
#!/bin/bash # @Author: HanWei # @Date: -- :: # @Last Modified by: HanWei # @Last Modified -- :: # @E ...
- Java 添加OLE对象到Excel文档
本文介绍通过Java程序添加OLE对象到Excel文档.OLE分为两种形式,一种通过嵌入(Embed),方式,一种通过链接(Link)方式.前者是将对象嵌入到文档中,外部对该对象的更改不影响嵌入操作时 ...