功能:动态获取类的信息以及动态调用对象的方法。

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)动态相关机制的更多相关文章

  1. java反射中的动态代理机制(有实例)

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

  2. java反射机制与动态加载类

    什么是java反射机制? 1.当程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言.我们认为java并不是动态语言,但是它却有一个非常突出的动态相关机制,俗称:反射. IT行业里这么说,没有 ...

  3. 大厂高级工程师面试必问系列:Java动态代理机制和实现原理详解

    代理模式 Java动态代理运用了设计模式中常用的代理模式 代理模式: 目的就是为其他对象提供一个代理用来控制对某个真实对象的访问 代理类的作用: 为委托类预处理消息 过滤消息并转发消息 进行消息被委托 ...

  4. 编译时和运行时、OC中对象的动态编译机制

    编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识别的字 ...

  5. Java反射(Reflection)

    基本概念 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? 答案是肯定的. 这种动态获取类的信息以及动态调用对象的方法的功能来自于J ...

  6. MyBatis之反射技术+JDK动态代理+cglib代理

    一.反射 引用百度百科说明: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功 ...

  7. Java的反射机制和动态代理

    介绍Java注解的时候,多次提到了Java的反射API.与javax.lang.model不同的是,通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理也是非常强大的功能,可以原 ...

  8. Java - 反射机制(Reflection)

    Java - 反射机制(Reflection)     > Reflection 是被视为 动态语言的关键,反射机制允许程序在执行期借助于 Reflection API 取得任何类的       ...

  9. java反射机制--reflection

    反射,reflection,听其名就像照镜子一样,可以看见自己也可以看见别人的每一部分.在java语言中这是一个很重要的特性.下面是来自sun公司官网关于反射的介绍:    Reflection is ...

随机推荐

  1. ASP.NET MVC 理解MVC模式

    ASP.NET MVC 理解MVC模式 PS:MVC出来很久了,工作上一直没机会用,所以我也没去学.出于兴趣,工作之余我将展开对MVC的深入学习,通过博文来记录所学所得,并希望能得到各位园友的斧正. ...

  2. <mate>标签中属性/值的各个意思

    <mate>标签中属性/值的各个意思 HTML 4 name 属性 1.<mate name="author" content="" /> ...

  3. Call U

    Communication - 02.Call U App层 从大拇哥Click CallButton开始手机便已明白,主人这是要打电话.当然,你可以选择直接拨号,也可以通过ContactList,或 ...

  4. Power BI官方视频(4) Power BI Desktop 2017年首次更新先睹为快

    在过去的2016年,Power BI Desktop在功能上进行了很多改进和更新,产品迭代速度非常快,基本是每个月一个版本.过去的一年,我们期待的Power BI中国区服务已经可以在世纪互联购买和使用 ...

  5. jprofiler8使用小贴士

    说明:本文的小贴士是针对jprofiler8的,其他版本上可能有不适用的地方 贴士一:使用jpenable监控,无需增加jvm参数和重启 贴士一:使用jpenable监控,无需增加jvm参数和重启 j ...

  6. C语言之位运算

    位运算 1).定义. 指的是1个二进制数据的每一位来参与运算. 位运算的前提: 是这个数必须是1个二进制. 注意: a). 参与位运算的二进制数据必须是补码形式. b). 位运算的结果也是二进制的补码 ...

  7. 不惧面试:HTTP协议(1) - 基础扫盲

    v博客前言 先交代下背景,之前在一家公司面试.NET开发,去了先是做一份笔试题,有一半是关于HTTP协议的,技术总监直接面试,也是问一大堆HTTP协议的知识点,可能跟该公司的产品有关,该公司属于互联网 ...

  8. JS设计模式之观察者模式

    观察者模式,即发布与订阅模式,实现一对多的一种关系模式,当一种对象接受信号时其他所有依赖均有行为.我们在写code的时候总是会去自定义一些事件,这就是观察者常常使用的地方: JS中的观察者模式应用: ...

  9. 安装hadoop-eclipse-plugin插件报错解决办法

    安装myecplise的hadoop-eclipse-plugin-2.2.0插件的时候,  把插件放到这个文件夹里 打开myeclipse windows-->preferences 点击 H ...

  10. Web.config 文件中的 system.webServer

    Web.config 文件中的 system.webServer 节用于指定适用于 Web 应用程序的 IIS 7.0 设置.system.WebServer 是 configuration 节的子级 ...