一、反射:

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. 我的ubuntu源18和16

    16阿里云的 deb cdrom:[Ubuntu 16.04 LTS _Xenial Xerus_ - Release amd64 (20160420.1)]/ xenial main restric ...

  2. python实例:自动爬取豆瓣读书短评,分析短评内容

    思路: 1.打开书本“更多”短评,复制链接 2.脚本分析链接,通过获取短评数,计算出页码数 3.通过页码数,循环爬取当页短评 4.短评写入到txt文本 5.读取txt文本,处理文本,输出出现频率最高的 ...

  3. JVM第一弹

    JVM第一弹 基本概念 JVM是可运行java代码的假想计算机,包括一套字节码指令集,一组寄存器,一个栈,一个垃圾回收.堆和一个存储方法域.JVM是运行在操作系统之上的,它与硬件没有直接的交互. 运行 ...

  4. C# list中ConvertAll的使用

    static double TakeSquareRoot(int x) { //return Math.Sqrt(x); ; } static void Main(string[] args) { L ...

  5. Web 开发工具类(1): CookieUtils

    CookieUtils 整合了常用的一些对Cookie的相关操作: package com.evan.common.utils; import java.io.UnsupportedEncodingE ...

  6. Tiny Linux -- tce-load

    Tiny Linux which has its own package manager called "tce-load". There's a list of packages ...

  7. c++中的动态内存分配

    使用new和delete动态的分配和释放内存 使用new来分配新的内存块,通常情况下,如果成功,new将返回一个指针,指向分配的内存,否则将引发异常,使用new时,需要指定要为那种数据类型分配内存: ...

  8. 深入理解windows 消息机制

    深入理解Windows消息机制 今天我们来学一学Windows消息机制,我们知道在传统的C语音程序中,当我们需要打开一个文件时,我们可以调用fopen()函数,这个函数最后又会调用操作系统提供的函数以 ...

  9. ARTS Week 3

    Nov 11,2019 ~ Nov 17,2019 Algorithm 本周来介绍快速求一个数字n次方的余数. 理论基础 我们先定义运算$ x \bmod p = r \(与\) x \equiv r ...

  10. Ansible: hosts文件拆分为inventory和定义inventory全局变量

    前言 随着管理机器的增多,我们在使用Ansible的时候时常会遇到hosts文件过于冗长的问题,极其不便于管理,而将hosts文件拆分为inventory就可解决该问题:另外,hosts中的每个主机条 ...