反射机制(reflection)动态相关机制
功能:动态获取类的信息以及动态调用对象的方法。
Java反射机制主要提供了以下功能:
1.在运行时判断任意一个对象所属的类。
2.在运行时构造任意一个类的对象。
3.在运行时判断任意一个类所具有的成员变量和方法。
4.在运行时调用任意一个对象的方法。
这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息。
包括其modifiers(诸如public、static等)、 superclass(例如Object)、实现了的 interfaces (例如Serializable)、也包括其fields(类的属性)和methods(类的方法)的所有信息,并可于运行时改变fields内容或调用methods。
Class c1=Class.forName("com.xsl.entity.Student");
System.out.println(c1.getName()); //com.xsl.entity.Student
System.out.println(c1.getSimpleName()); //Student
System.out.println(c1.gerSuperClass()); //class java.lang.object
import java.lang.reflect.Method;
public class DumpMethods
{
public static void main(String[] args) throws Exception
{
//获得字符串所标识的类的class对象
Class<?> classType = Class.forName("java.lang.String");//在此处传入字符串指定类名,所以参数获取可以是一个运行期的行为,可以用args[0]
//返回class对象所对应的类或接口中,所声明的所有方法的数组(包括私有方法)
Method[] methods = classType.getDeclaredMethods();
//遍历输出所有方法声明
for(Method method : methods)
{
System.out.println(method);
}
}
}
获取Class类型的对象的4种方式
//1、及时加载方式
Class c = Class.forName("...");
类名 变量名 = (类名)c.newInstance(); //实例化
//2、延时加载方式
Class c = 类名.class;
类名 变量名 = (类名)c.newInstance(); //实例化
//3、通过对象来获取
Class c = new 类名().getClass();
类名 变量名 = (类名)c.newInstance(); //实例化
//4、通过类加载器来加载
ClassLoad loader = ClassLoader.getSystemClass();
Class c = loader.loadClass("...");
类名 变量名 =(类名) c.newInstance(); //实例化
生成对象的两种方法
1、先获得Class对象,然后通过该Class对象的newInstance()方法直接生成。(上面都是采用这种方法生成的)
2、先获得Class对象,然后通过该对象获得对应的Constructor对象,再通过该Constructor对象的newInstance()方法生成。
Class<?> classType = Student.class;
// 获得Constructor对象,此处获取第一个无参数的构造方法的
Constructor cons = classType.getConstructor(new Class[] {});
// 通过构造方法来生成一个对象
Object obj = cons.newInstance(new Object[] {});
获取类加载器:系统(应用程序)加载器(AppClassLoader)、扩展加载器(ExtClassLoader)、根加载器
如:
Class c1 = Class.forName("...");
System.out.println(c1.getClassLoader()); //...AppClassLoader...应用程序加载器 加载当前项目路径或类路径中自定义类型
System.out.println(c1.getClassLoader().getParent()); //...ExtClassLoader...扩展加载器 E:\JDK1.8\jre\lib\ext
System.out.println(c1.getClassLoader().getParent().getParent()); //null 根加载器
加载原则、向上委托原则、一致性原则、向上透明性原则
网络加载器(属于扩展加载器)
URL [] urls = {new URL("http://localhost:8080/textpro/love.jar")};
URLClassLoader loader = new URLClassLoader(urls);
Class c = loader.loadClass("com.xsl.entity.Student");
Student s = (Student)c.newInstance();
优先本地
利用反射调用私有方法、访问私有属性
首先是Class对象的获取,之后是Method和Field对象的获取。
以Method为例:
getMethod()方法返回的是public的Method对象,
而getDeclaredMethod()返回的Method对象可以是非public的。
Field的方法同理。
可参考http://www.cnblogs.com/mengdd/archive/2013/01/26/2878136.html
反射机制(reflection)动态相关机制的更多相关文章
- java反射中的动态代理机制(有实例)
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
- java反射机制与动态加载类
什么是java反射机制? 1.当程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言.我们认为java并不是动态语言,但是它却有一个非常突出的动态相关机制,俗称:反射. IT行业里这么说,没有 ...
- 大厂高级工程师面试必问系列:Java动态代理机制和实现原理详解
代理模式 Java动态代理运用了设计模式中常用的代理模式 代理模式: 目的就是为其他对象提供一个代理用来控制对某个真实对象的访问 代理类的作用: 为委托类预处理消息 过滤消息并转发消息 进行消息被委托 ...
- 编译时和运行时、OC中对象的动态编译机制
编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识别的字 ...
- Java反射(Reflection)
基本概念 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? 答案是肯定的. 这种动态获取类的信息以及动态调用对象的方法的功能来自于J ...
- MyBatis之反射技术+JDK动态代理+cglib代理
一.反射 引用百度百科说明: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功 ...
- Java的反射机制和动态代理
介绍Java注解的时候,多次提到了Java的反射API.与javax.lang.model不同的是,通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理也是非常强大的功能,可以原 ...
- Java - 反射机制(Reflection)
Java - 反射机制(Reflection) > Reflection 是被视为 动态语言的关键,反射机制允许程序在执行期借助于 Reflection API 取得任何类的 ...
- java反射机制--reflection
反射,reflection,听其名就像照镜子一样,可以看见自己也可以看见别人的每一部分.在java语言中这是一个很重要的特性.下面是来自sun公司官网关于反射的介绍: Reflection is ...
随机推荐
- Eclipse RCP /Plugin移除Search对话框
RCP:如何移除Search对话框中不需要的项 2013-08-18 22:31 by Binhua Liu, 231 阅读, 0 评论, 收藏, 编辑 前言 很久没写文章了,准备写一系列关于Ecli ...
- Kendo UI开发教程(7): Kendo UI 模板概述
Kendo UI 框架提供了一个易用,高性能的JavaScript模板引擎.通过模板可以创建一个HTML片段然后可以和JavaScript数据合并成最终的HTML元素. Kendo 模板侧重于UI显示 ...
- 2013Esri全球用户大会之互操作和标准
1:Esri在开源领域做过哪些工作? Esri一直以来就是开源技术的用户和支持者.我们相信,通过提供从上到下的开放平台可使我们的用户成为开发能力强大的解决方案的积极参与者.在现有技术形势下,我们正在将 ...
- Eclipse代码自动提示设置
以前百度过如何设置Eclipse代码自动提示,但是本人记性不好,所以把这个方法写成一篇日志,这样以后就不用百度了,直接看自己的博客就是了,而且还增加了自己博客的点击量.以下是从各个地方看到总结的方法: ...
- c语言栈的链表实现
#include <stdio.h> #include <stdlib.h> #include"PublicDS.h" typedef int ElemTy ...
- PYTHON黑帽编程 4.1 SNIFFER(嗅探器)之数据捕获(下)
上一节(<4.1 SNIFFER(嗅探器)之数据捕获(上)>)中, 我们讲解了通过Raw Socket的方式来编写Sniffer的基本方法. 本节我们继续来编写Sniffer,只不过使用现 ...
- [开发者账号] ios7苹果开发者账号申请
1.登陆 https://developer.apple.com/ 2.点击网站最底部的 3.点击 4.然后根据提示继续点击 注意:1.点击的过程中注意个人和企业账号 开发者类型等 2.付款账号的 ...
- [ios2]iOS 使用subversion管理iOS源代码 【转】
使用subversion管理iOS源代码 1.安装和配置subversion服务器 在windows 服务器上安装VisualSVN-Server,下载地址http://www.visualsvn.c ...
- shell编程其实真的很简单(二)
上篇我们学会了如何使用及定义变量.按照尿性,一般接下来就该学基本数据类型的运算了. 没错,本篇就仍是这么俗套的来讲讲这无聊但又必学的基本数据类型的运算了. 基本数据类型运算 操作符 符号 语义 描述 ...
- CodeForces 157C Message
$dp$. $dp[i][j]$表示$s[i]$到$s[j]$和$t[lent-1+i-j]$到$t[lent-1]$有$dp[i][j]$位相同,然后枚举一遍$dp[i][j]$就可以算出答案了. ...