- 浏览: 6351694 次
- 性别:
- 来自: 一片神奇的土地
文章分类
- 全部博客 (745)
- JQuery (25)
- JS (33)
- 数据库 (59)
- Java基础 (56)
- JSON (8)
- XML (8)
- ireport (7)
- 设计模式 (10)
- 心情 (14)
- freemarker (1)
- 问题 (15)
- powerdesigner (2)
- CSS (15)
- DWR (4)
- tomcat (16)
- Hibernate (12)
- Oracle (7)
- Struts (7)
- Spring (34)
- JSP (23)
- 需学习 (64)
- 工具类库 (63)
- Maven (14)
- 笔试题 (34)
- 源码学习 (31)
- 多线程 (39)
- Android (32)
- 缓存 (20)
- SpringMVC (14)
- jQueryEasyUi (12)
- webservice-RPC (13)
- ant (1)
- ASP.NET (10)
- 正则表达式 (3)
- Linux (15)
- JBoss (1)
- EJB (3)
- UML (2)
- JMS (3)
- Flex (8)
- JSTL (2)
- 批处理 (5)
- JVM (16)
- 【工具】 (16)
- 数据结构 (29)
- HTTP/TCP/Socket (18)
- 微信 (1)
- tomcat源码学习 (15)
- Python (30)
- 主机 (2)
- 设计与架构 (19)
- thrift-RPC (2)
- nginx (6)
- 微信小程序 (0)
- 分布式+集群 (12)
- IO (1)
- 消息队列 (4)
- 存储过程 (8)
- redis (9)
- zookeeper (5)
- 海量数据 (5)
最新评论
-
360pluse:
技术更新,战术升级!Python爬虫案例实战从零开始一站通网盘 ...
Python爬虫实战:Scrapy豆瓣电影爬取 -
18335864773:
推荐用 pageoffice 组件生成 word 文件。
JAVA生成WORD工具类 -
jjhe369:
LISTD_ONE 写道起始地址为163.135.0.1 结束 ...
IP地址与CIDR -
baojunhu99:
private final int POOL_SIZE = 5 ...
使用CompletionService获取多线程返回值 -
LovingBaby:
胡说,javascript 运行时是单线程的,event lo ...
Ajax请求是否可以实现同步
Reflection 是 Java 程序开发语言的重要特征之一,是学习Java必须知识点。
Java反射机制主要提供了以下功能:在运行时构造一个类的对象;判断一个类所具有的成员变量和方法;调用一个对象的方法;生成动态代理。反射最大的应用就是框架
Java.lang.Class和Java.lang.reflect包下的API,用于表示或者处理当前JVM中的类,接口和对象。
Java反射的主要功能:
确定一个对象的类
取出类的modifiers,数据成员,方法,构造器,和超类.
找出某个接口里定义的常量和方法说明.
创建一个类实例,这个实例在运行时刻才有名字(运行时间才生成的对象).
取得和设定对象数据成员的值,如果数据成员名是运行时刻确定的也能做到.
在运行时刻调用动态对象的方法.
创建数组,数组大小和类型在运行时刻才确定,也能更改数组成员的值.
Class类是Java反射的基础,Class类表示正在运行的java应用程序中的类和接口。Class只有私有的构造函数。Class类在加载类时由Java虚拟机以及调用类加载器中的 defineClass方法自动创建的。只在内存中存在一份加载类的Class类。
三种方式得到某个Java类的Class类,以java.lang.String为例:
String s = "aaa"; Class cls1 = s.getClass(); Class cls2 = String.class; Class cls3 = Class.forName("java.lang.String"); if (cls1 == cls2) { System.out.println("cls1 == cls2"); } if (cls2 == cls3) { System.out.println("cls2 == cls3"); }
为什么他们三个会==呢?因为他们描述的都是同一个类java.lang.String类。
Class类还有很多方法,配合java.lang.reflect包下的一些API可以实现更多的功能。
一个javabean
package org.legend.reflect; public class UserInfo { private String userName; private Integer age; public String school; public UserInfo() { } public UserInfo(String name, Integer age, String shool) { this.userName = name; this.age = age; this.school = shool; } public UserInfo(String name, Integer age) { this.userName = name; this.age = age; } public String getInfo(String n, Integer i) { return "success" + n + i; } public void getMyInfo(String mName, String mBirth, Integer age) { System.out.println("我是一个来自" + mBirth + "的名叫:" + mName + "的" + age + "岁的选手"); } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } }
一个操作类:
package org.legend.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; /** * 反射操作类 */ public class GetMyInfo { public static void main(String[] args) throws ClassNotFoundException, SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { Class mclass = Class.forName("org.legend.reflect.UserInfo"); System.out.println("------------输出类名-----------------------"); System.out.println(mclass.getName()); System.out.println(mclass.getSimpleName()); //基础类的简称 //获取属性(字段) System.out.println("------------输出所有属性--------------------"); Field[] fileds=mclass.getDeclaredFields(); //得到所有的字段,包括公共,保护,默认(包)和私有变量,但不包括继承的字段。 //Field[] fileds = mclass.getFields(); //得到所有的公共字段。 for(Field field:fileds) { String fieldName = field.getName(); //属性名称 int fieldFangWen = field.getModifiers(); //属性访问权限修饰符 Class fieldType = field.getType(); //属性类型 System.out.println(Modifier.toString(fieldFangWen)+" "+fieldType.getSimpleName()+" "+fieldName); } //获取方法 System.out.println("------------输出所有方法--------------------"); Method [] methods=mclass.getDeclaredMethods(); //Method[] medthods = mclass.getMethods(); for(Method method:methods) { String methodName = method.getName(); //方法名称 int methodFangWen = method.getModifiers(); //访问修饰符 Class methodRetrunType = method.getReturnType();//返回类型 Class [] methodParameter = method.getParameterTypes();//方法的参数列表 System.out.print(Modifier.toString(methodFangWen)+" "+methodRetrunType.getSimpleName()+" "+methodName+"("); for(int k=0;k<methodParameter.length;k++) { String parameterName=methodParameter[k].getSimpleName(); if(k!=methodParameter.length-1) { System.out.print(parameterName+" arg"+k+","); } else System.out.print(parameterName+" arg"+k); } System.out.println(");"); } //获取构造 System.out.println("------------输出所有构造器--------------------"); Constructor[]constructors = mclass.getConstructors(); for(Constructor constructor:constructors) { String constructorName = constructor.getName(); Class[] constructorParameter = constructor.getParameterTypes(); System.out.print(mclass.getSimpleName()+" "+constructorName.substring(constructorName.lastIndexOf(".")+1, constructorName.length())+"("); for(int h=0;h<constructorParameter.length;h++) { String parameterName = constructorParameter[h].getSimpleName(); if(h!=constructorParameter.length-1) System.out.print(parameterName+" arg"+h+","); else System.out.print(parameterName+" arg"+h); } System.out.println(");"); } //如何执行指定的方法 System.out.println("------------反射执行方法--------------------"); String name ="getMyInfo"; Class[] parameterTypes = new Class[3]; parameterTypes[0]= String.class; parameterTypes[1]= String.class; parameterTypes[2]= Integer.class; Method me = mclass.getDeclaredMethod(name, parameterTypes); Object obj = mclass.newInstance(); Object[] arg = new Object[3]; arg[0]="范晶晶"; arg[1]="AAA风景区"; arg[2]=new Integer(18); me.invoke(obj, arg); } }
反射的应用很多,很多框架都有用到
spring 的 ioc/di 也是反射....
javaBean和jsp之间调用也是反射....
struts的 FormBean 和页面之间...也是通过反射调用....
JDBC 的 classForName()也是反射.....
hibernate的 find(Class clazz) 也是反射....
反射还有一个不得不说的问题,就是性能问题,大量使用反射系统性能大打折扣。怎么使用使你的系统达到最优就看你系统架构和综合使用问题啦,这里就不多说了。。。
http://www.4ucode.com/Study/Topic/630405
发表评论
-
拦截器和过滤器的区别
2019-06-27 10:46 7060【Spring的拦截器】于【Servlet的Filter】有 ... -
高并发下的数据结构List/Set/Map
2019-03-26 14:17 1268高并发下的Java数据结 ... -
AQS
2019-03-21 15:08 2081大白话聊聊Java并发面试问题之谈谈你对AQS的理解? ... -
tomcat的三种运行模式+JAVA NIO
2019-03-12 11:13 5083详解Tomcat三种运行模 ... -
反射基础
2019-01-11 14:51 662十年架构师不到400行手写一个Spring MVC ... -
java反射原理, 注解原理
2019-01-08 17:22 4584注解机制及原理 JAVA ... -
内存泄露与内存溢出的区别
2018-12-24 16:14 27451、内存泄漏 memory le ... -
深入解析JAVA中的装箱与拆箱
2018-12-21 10:42 1318地址: https://www.cnblogs.com/d ... -
负载均衡原理
2018-12-20 17:43 799简介几种负载均衡原理 高并发解决方案之一 ——负载均衡 ... -
如何避免死锁
2018-12-20 15:31 3392一句话一张图说明银行 ... -
CAS自旋锁
2018-12-20 11:12 1645我们常说的 CAS 自旋锁是什么 CAS与ABA问题 ... -
【一个故事讲清楚NIO+Netty线程模型】
2018-08-22 10:30 3335五种网络io模型 一个简单故事讲述NIO blo ... -
char/varchar/nvarchar的区别及其各自的使用场景
2018-08-20 10:58 2435MySQL数据库char与varchar ... -
MVCC
2018-08-20 10:34 3543轻松理解MYSQL MVCC 实现机制 1.1 什 ... -
【tomcat系统架构(一)】
2018-08-16 16:02 1570四图带你了解Tomcat系统架构——让面试官颤抖Tomca ... -
分布式ID的实现方式
2018-04-27 18:19 3668分布式ID方案有哪些以及各自的优劣势 分布式ID生成器解 ... -
分布式锁的实现方式
2018-04-27 15:35 1797分布式锁解决方案-头条 分布式锁三种实现方式-CSDN ... -
【学习升级路线2】
2018-04-26 13:43 800非技术问题 研究比较深入的领域有哪些 对业内信息的关注 ... -
【学习升级路线1】
2018-04-26 13:54 982思维的惰性 我30的 ... -
需学习东西(面试问题)-backup
2018-04-26 13:46 1485记2017.3.21阿里面试经历,java方向 历年阿里面 ...
相关推荐
下面将详细阐述Java反射机制的基本概念、用途及其实现方式。 1. **基本概念**: - **类的Class对象**:每个Java类都有一个对应的Class对象,它包含了类的所有信息,如类名、方法、属性等。通过`Class.forName()`...
### JAVA反射机制详解 #### 一、JAVA反射机制概述 **反射**是在1982年由Smith首次提出的概念,指的是程序有能力访问、检测并修改其自身的状态或行为。这一概念一经提出,便迅速引起了计算机科学领域的关注,并在多...
Java反射机制是Java语言的一项强大功能,允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。它提供了在运行时访问类、接口、字段和方法的能力,即使这些信息在编译时未知。通过Class对象,我们...
下面将详细阐述C#反射的基本概念、用途及其相关知识点。 一、什么是C#反射 C#反射是一种动态类型处理能力,它可以在运行时获取类、接口、结构、枚举等类型的信息,包括它们的成员(如字段、属性、方法和事件)以及...
反射是.NET框架的核心机制之一,它允许程序在运行时动态地获取类型信息并调用类型的方法或属性。这为开发人员提供了极大的灵活性,尤其是在处理未知类型的对象时。本文将深入探讨C#中的反射技术及其应用场景。 ####...
Java反射机制允许我们在运行时检查类、接口、字段和方法的信息,甚至可以动态创建对象并调用方法。通过`java.lang.Class`类,我们可以获取任何类型的类对象,进而获取其构造器、方法和字段。反射的一个常见用途是在...
下面我们将深入探讨C#反射的核心概念、主要用途及其在实际开发中的应用。 一、反射基础 1. 类型信息:反射提供了一种方式来获取关于类、接口、结构、枚举等类型的信息。`Type`类是反射的核心,代表任何.NET类型。...
本文系统地介绍了C#中的抽象类、接口、委托和反射的概念及其应用。通过这些基础知识的学习,可以帮助开发者更好地理解和应用面向对象编程中的核心概念和技术。此外,还探讨了抽象类与接口之间的区别,以及如何在实际...
1. 反射:理解反射机制,知道如何通过Class类获取类信息,创建对象,调用方法。 2. 注解:理解注解的用途,知道如何自定义注解和使用元注解。 七、Java集合框架的高级部分 1. 高级集合:理解TreeSet、TreeMap的...
### C#反射学习文档:深入理解同步与异步方法调用 #### 概述 本文档旨在介绍C#中同步与异步方法调用的基本概念及其应用方式,这对于理解和掌握.NET框架下的多线程编程非常关键。同步和异步方法的选择直接影响到...
- 反射:理解反射机制,能在运行时动态获取类信息并调用方法。 3. **集合框架** - List、Set、Queue:理解各种接口如ArrayList、LinkedList、HashSet、TreeSet等的特点和使用场景。 - Map:熟悉HashMap、TreeMap...
- 反射机制:理解反射的用途,能够动态获取类信息,创建对象并调用方法。 - 注解(Annotation):知道注解的元注解、自定义注解及其使用场景。 6. **输入输出流(IO)与NIO** - 文件操作:掌握File类的使用,...
1. 反射:理解反射机制,如何在运行时获取类的信息并进行操作。 2. 动态代理:了解动态代理的概念,以及Java动态代理API的使用。 通过这些基础知识的学习和深入理解,不仅能够应对Java笔试,还能为日常开发工作打下...
12. **反射**:Java反射机制允许在运行时动态访问类的信息,如创建对象、调用方法、修改字段等。虽然在笔试中较少直接考查,但了解其原理和应用,能提升解题的灵活性。 13. **设计模式**:常见的设计模式如单例、...
- 反射:理解Class类,如何通过反射动态调用方法、创建对象和访问字段。 - 注解:了解注解的使用,自定义注解及其处理器。 8. **设计模式** - 常见设计模式:熟悉单例、工厂、观察者、装饰器、代理等设计模式的...
- 反射:理解反射机制,如何动态获取和调用类、方法、字段。 3. **Java Web基础** - Servlet:学习Servlet生命周期,请求响应流程,以及过滤器和监听器的使用。 - JSP:理解JSP脚本元素,EL表达式,JSTL标签库的...
- 未能正确理解软件的容错机制,这可能导致设计过程中出现不合理甚至是错误的参数设置。 4. **解决方案**: - 在设计过程中应遵循射频电路设计的基本原则,例如正确处理分布参数效应、合理选择元件布局等。 - ...
它的工作机制在于,涂层中的特殊添加剂如颜料、填料和反射材料可以吸收、散射和反射太阳的红外辐射,减少热量进入建筑物。同时,良好的热绝缘性能可限制热量通过涂层进行传导。此外,涂料的低导热系数有助于防止热量...
Java笔试题常常涵盖众多知识点,包括但不限于基础语法、面向对象编程、集合框架、多线程、异常处理、IO流、网络编程、反射机制、设计模式等。以下将针对这些常见领域进行详细的阐述。 1. **基础语法**:这是Java...
理解这个过程及其潜在的性能影响是重要的。 - 多态与虚方法:C#的多态性和虚方法实现动态绑定,需要理解这些概念以及何时使用override和new关键字。 3. 两者共有的难点: - 都有丰富的库和框架,如Java的Spring和...