博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
反射机制(reflection)动态相关机制
阅读量:5869 次
发布时间:2019-06-19

本文共 2653 字,大约阅读时间需要 8 分钟。

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

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

转载于:https://www.cnblogs.com/xsl1995/p/6277962.html

你可能感兴趣的文章
关于<!DOCTYPE>标签
查看>>
浅谈虚拟DOM
查看>>
Jquery动态控制表格行
查看>>
【算法和数据结构】_12_小算法_abs_fabsf_fabsd_大端小端判断
查看>>
PowerShell_零基础自学课程_4_PowerShell的别名功能、错误管理功能和系统资源区域导航...
查看>>
Cogs 1583. [POJ3237]树的维护 LCT,树链剖分
查看>>
上不了网,如何判断
查看>>
sharepoint 还原网站集
查看>>
set serveroutput on 命令
查看>>
《微信企业号开发日志》本地调试程序一
查看>>
vue watch深度监听对象,实现数据联动
查看>>
c#判断输入的是不是数字
查看>>
必应词典手机版(IOS版)与有道词典(IOS版)之软件分析【功能篇】【用户体验篇】...
查看>>
lunix 思维导图
查看>>
P3755 [CQOI2017]老C的任务
查看>>
android一个倾斜的TextView,适用于标签效果
查看>>
深入理解Java虚拟机01--概述
查看>>
ASP.NET MVC+EF5 开发常用代码
查看>>
java语言之创建多个对象
查看>>
"TVB体" 语句
查看>>