java反射浅谈 part1--反射机制的定义,作用,原理
一.定义
在运行过程中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;还可以通过反射创建对象,这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
二.能做什么
1.在运行时判断任意一个对象所属的类
2.在运行时构造任意一个类的对象
3.在运行时判断任意一个类所具有的成员变量和方法
4.运行时调用任意一个对象的方法
5.生成动态代理
三.原理,通过例子说明
public class Test {
public static void main(String[] args) {
//指定类名
String className = "com.template.Runable.testHello";
testHello test = null;
try {
//用类名根据反射创建实例,并调用实例的方法
Class th = Class.forName(className);
test = (testHello)th.newInstance();
test.main(null);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
结果: 输出了我指定类里面的main函数
从执行过程说原理
Class.forName(classname):调用
forName0(className, true, ClassLoader.getClassLoader(caller), caller)
className:类名
true:初始化该类
ClassLoader.getClassLoader(caller):获取当前类加载器
caller:当前类
解释:要想使用类,必须使用类加载器进行加载,类加载器先检查自己是否已经加载过该类,加载过:直接返回,没有:调用父类的loadClass方法,父类中没有,执行findClass()去尝试从生成的.class文件加载此类,主要通过defineClass()完成,将字符数组转换成Class类,这种转换的类需要通过newInstance去创建实例,不能通过new Class实例化,注:反射是有缓存的,不会每次都去重新反射。
java反射浅谈 part1--反射机制的定义,作用,原理的更多相关文章
- Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理
Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理 转自:https://www.jianshu.com/p/2b71ea919d49 本系列文章首发于我的个人博 ...
- 【推荐】JAVA基础◆浅谈3DES加密解密
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- 浅谈JVM线程调度机制及主要策略
在之前有说过线程,应该都知道,所谓线程就是进程中的一个子任务,一个进程有多个线程.今天的话主要就是谈一谈JVM线程调度机制.我们结合线程来说,当我们在做多线程的案例时,如一个经典案例,火车站卖票. * ...
- java基础解析系列(八)---fail-fast机制及CopyOnWriteArrayList的原理
fail-fast机制及CopyOnWriteArrayList的原理 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列( ...
- android的Binder通信机制java层浅谈-android学习之旅(88)
1.Service Manager的Java代理对象 在Java层中,Service Manager的代理对象类型为ServiceManagerProxy.它继承并且实现了IServiceManage ...
- 浅谈利用同步机制解决Java中的线程安全问题
我们知道大多数程序都不会是单线程程序,单线程程序的功能非常有限,我们假设一下所有的程序都是单线程程序,那么会带来怎样的结果呢?假如淘宝是单线程程序,一直都只能一个一个用户去访问,你要在网上买东西还得等 ...
- Java注解浅谈
注解定义(来自百度百科):指示编译器如何对待您的自定义 Annotation,预设上编译器会将Annotation资讯留在class档案中,但不被虚拟机器读取,而仅用于编译器或工具程式运行时提供资讯. ...
- java多线程浅谈
当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 分这几种情况: 1.其他方法前是否加了synchronized关键字,如果没加,则能. 2 ...
- Java:浅谈InputStream的close方法
原则:最好在任何时候使用InputStream或者OutputStream的时候,在finally中调用close()方法,显式关闭. 一个典型的示例 InputStream in = null; t ...
随机推荐
- 小D课堂 - 新版本微服务springcloud+Docker教程_4-03 高级篇幅之Ribbon负载均衡源码分析实战
笔记 3.高级篇幅之Ribbon负载均衡源码分析实战 简介: 讲解ribbon服务间调用负载均衡源码分析 1.完善下单接口 2.分析@LoadBalanced ...
- Kafka API使用
- Java泛型(10):泛型与异常
由于擦除的原因,将泛型运用于异常是非常受限的.catch语句不能捕获泛型类型的异常,因为在编译期和运行期都必须知道异常的确切类型.但是,类型参数可能会在一个方法的throw子句中用到.这使得你可以编写 ...
- android破解AndroidManifest.xml文件
使用java -jar E:\AXMLPrinter2.jar E:\AndroidManifest.xml > E:\manifest.txt 但要先下载AXMLPrinter2.jar(h ...
- 《JAVA语言》第三节课
使用递归方式判断某个字串是否是回文( palindrome ). 1. 设计思想 在判断字符串是否是回文的时,采用递归法,首先要分析出重复做的是什么事情,这里是要重复判断两端的字符是不是相等的,直到剩 ...
- Ubuntu更换科大源
更换科大源 方案一:在命令行输入 sudo gedit /etc/apt/sources.list ,打开系统自带源文件. 将文件内源删除,更换为以下科大源: deb http://mirrors.a ...
- redis哨兵sentinel.conf文件
关闭保护模式 //17行 protected-mode no 端口号 //21 port 26379 后台启动 //26 daemonize yes //84行 主机的ip加端口号 2 为票数 sen ...
- Netty如何支持三种Reactor
参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! 什么是Reactor及三种版本 反应堆设计模式(Reactor pa ...
- DLL导出函数
使用DEF文件从DLL导出 模块定义(.def)文件时包含一个或多个描述DLL各种属性的Module语句的文本文件.如果不使用_declspec(dllexport)关键字导出DLL的函数,则DLL需 ...
- php通过session来实现登录验证
1.概述 这几天在做一个内部统计管理系统,所有内容需要登录后才能查看.这就需要系统内部每个模块都有登录验证的功能.在网上找了一圈资料,决定用session来做. 2.系统概况 后端语言:php(用的是 ...