一、反射:

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. 使用doxygen

    Getting started with Doxygen 可执行文件doxygen是解析源文件并生成文档的主程序. 另外, 也可以使用可执行文件doxywizard, 是用于编辑配置文件, 以及在图形 ...

  2. golang中基本类型存储大小和转换

    Go语言的基本类型有: bool string int.int8.int16.int32.int64 uint.uint8.uint16.uint32.uint64.uintptr byte // u ...

  3. Quantitative Trading with R(一):两个简单的策略

    下面是两个使用R中的Quantstrat包进行策略构建的例子,都是对600550.ss.600192.ss.600152.ss.600644.ss.600885.ss.600151.ss六只股票进行投 ...

  4. zabbix3.4搭建微信报警

    身为小白的我在历经被百度查到的资料坑了无数次之后,终于找到了一个正确的文档,下面是我自己的对于安装过程的理解与阐述. 一.申请微信企业号,获取以下数据. 企业ID:(在我们企业最下方可以看到) 应用的 ...

  5. Oracle 11g 单实例静默安装实战记录(linux)

    oracle 11g 单实例静默安装 AUTHOR:Oracle_Ran 环境规划: OS Version : Red Hat Enterprise Linux Server release 6.7 ...

  6. 《快乐编程大本营》java语言训练班 3课:java的运算符

    第1节. 算术运算符 第2节. 递增和递减运算符 第3节. 比较运算符 第4节. 逻辑运算符 第5节. 运算符优先级 第6节. 字符串运算 http://code6g.com/pxphp/px/ban ...

  7. 死磕dtd(1)

    看到安卓开发里大量的xml文件和layout里的Android UI开始复习一下xml xml的校验规则依据dtd dtd里面大小写敏感.....查找了好久才发现这个问题 <?xml versi ...

  8. C++调用DLL方法

    调用的原理: 调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同.Windows提供了两种将DLL映像到进程地址空间的方法:隐式 ...

  9. SpringBoot项目版本升级:从1.5.3升级到2.1.8版本

    SpringBoot项目版本升级:从1.5.3升级到2.1.8版本 前言 简单记录一次本人在自己的SpringBoot项目project-template中,把1.5.3版本升级到2.1.8版本时升级 ...

  10. 深入理解JVM(二)--垃圾收集算法

    一. 概述 说起垃圾收集(Garbage Collection, GC), 大部分人都把这项技术当做Java语言的伴随生产物. 事实上, GC的历史远远比Java久远, 1960年 诞生于MIT的Li ...