Java反射定义、获取Class三种方法
反射机制的定义:
在运行状态时(动态的),对于任意一个类,都能够得到这个类的所有属性和方法。
对于任意一个对象,都能够调用它的任意属性和方法。
Class类是反射机制的起源,我们得到Class类对象有3种方法:
第一种:通过类名获得
Class<?> class = ClassName.class;
第二种:通过类名全路径获得:
Class<?> class = Class.forName("类名全路径");
第三种:通过实例对象获得:
Class<?> class = object.getClass();
通过代码总结三种方法的区别:
/**
* Created by hunt on 2017/6/23.
*/ /**
* 测试类
*/
public class ClassTest {
static{
System.out.println("静态代码块儿...");
}
{
System.out.println("动态构造块儿...");
}
public ClassTest(){
System.out.println("构造方法...");
}
}
/**
* Created by hunt on 2017/6/23.
*/ /**
* 第一种方法获得Class对象
*/
public class MainTest {
public static void main(String[] args) {
Class<?> calss = ClassTest.class;
}
} /**
* 打印结果是:
* 什么都没打印
* 说明ClassName.class不执行静态块和不执行动态块儿
*/
/**
* Created by hunt on 2017/6/23.
*/ /**
* 第二种方法获得Class对象
*/
public class MainTest {
public static void main(String[] args) {
try {
Class<?> calss = Class.forName("com.souche.lease.admin.mytest.reflect.ClassTest");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
} /**
* 打印结果是:
* 静态代码块儿...
* 说明Class.forName("类名全路径")执行静态块但是不执行动态块儿(需要异常处理)
*/
/**
* Created by hunt on 2017/6/23.
*/ /**
* 第三种方法获得Class对象
*/
public class MainTest {
public static void main(String[] args) {
Class<?> calss = new ClassTest().getClass();
}
} /**
* 打印结果是:
* 静态代码块儿...
动态构造块儿...
构造方法...
* 说明对象.getClass()执行静态块也执行动态块儿
*/
总结:第一种方法:类字面常量使得创建Class对象的引用时不会自动地初始化该对象,而是按照之前提到的加载,链接,初始化三个步骤,这三个步骤是个懒加载的过程,不使用的时候就不加载。
第二种方法:Class类自带的方法。
第三种方法:是所有的对象都能够使用的方法,因为getClass()方法是Object类的方法,所有的类都继承了Object,因此所有类的对象也都具有getClass()方法。
建议:使用类名.class,这样做即简单又安全,因为在编译时就会受到检查,因此不需要置于try语句块中,并且它根除了对forName()方法的调用,所以也更高效。
注意:静态块仅在类加载时执行一次,若类已加载便不再重复执行;而动态构造块在每次new对象时均会执行。
Java反射定义、获取Class三种方法的更多相关文章
- [转]Javascript定义类的三种方法
作者: 阮一峰 原文地址:http://www.ruanyifeng.com/blog/2012/07/three_ways_to_define_a_javascript_class.html 将近2 ...
- Struts2获取request三种方法
Struts2获取request三种方法 struts2里面有三种方法可以获取request,最好使用ServletRequestAware接口通过IOC机制注入Request对象. 在Actio ...
- Java遍历List集合的三种方法
Java遍历List集合的三种方法 List<String> list = new ArrayList<String>(); list.add("aaa") ...
- Java基础—实现多线程的三种方法
Java虚拟机(JVM,是运行所有Java程序的抽象计算机,是Java语言的运行环境)允许应用程序并发地运行多个线程.在Java语言中,多线程的实现一般有以下三种方法: 1.实现Runnable接口, ...
- JAVA之线程同步的三种方法
最近接触到一个图片加载的项目,其中有声明到的线程池等资源需要在系统中线程共享,所以就去研究了一下线程同步的知识,总结了三种常用的线程同步的方法,特来与大家分享一下.这三种方法分别是:synchroni ...
- (转)JAVA 调用Web Service的三种方法
1.使用HttpClient用到的jar文件:commons-httpclient-3.1.jar方法:预先定义好Soap请求数据,可以借助于XMLSpy Professional软件来做这一步生成. ...
- Java实现ping功能的三种方法及Linux的区分
前大半部份转自:https://blog.csdn.net/futudeniaodan/article/details/52317650 检测设备的运行状态,有的是使用ping的方式来检测的.所以需要 ...
- Java原来如此-遍历Map的三种方法
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; pub ...
- Java中终止线程的三种方法
终止线程一般建议采用的方法是让线程自行结束,进入Dead(死亡)状态,就是执行完run()方法.即如果想要停止一个线程的执行,就要提供某种方式让线程能够自动结束run()方法的执行.比如设置一个标志来 ...
随机推荐
- Python标准库之ConfigParser模块
配置文件的格式 a) 配置文件中包含一个或多个 section, 每个 section 有自己的 option: b) section 用 [sect_name] 表示,每个option是一个键值对, ...
- SQL学习 DECODE
from 百度百科: DECODE有什么用途呢? 先构造一个例子,假设我们想给这些职员加工资,其标准是:工资在8000元以下的加20%:工资在8000元或以上的加15%,通常的做法是,先选出记录中的工 ...
- ServerSocketChannel、SocketChannel、Selector等概念04
java.nio包中的主要类ServerSocketChannel:ServerSocket的替代类,支持阻塞通信与非阻塞通信.SocketChannel:Socket的替代类,支持阻塞通信与非阻塞通 ...
- Raft与MongoDB复制集协议比较
在一文搞懂raft算法一文中,从raft论文出发,详细介绍了raft的工作流程以及对特殊情况的处理.但算法.协议这种偏抽象的东西,仅仅看论文还是比较难以掌握的,需要看看在工业界的具体实现.本文关注Mo ...
- Auto Layout: Programmatic Constraints - BNR
继续Auto Layout - BNR篇. 打开BNRDetailViewController.m文件,重载viewDidLoad方法来创建UIImageView对象.当你想要给通过加载NIB文件创建 ...
- 【Swift 3.0】iOS 国际化切换语言
有的 App 可能有切换语言的选项,结合系统自动切换最简单的办法: fileprivate var localizedBundle: Bundle = { return Bundle(path: Bu ...
- JS 设计模式三 -- 策略模式
策略模式 概念 定义一系列算法,把它们一个个封装起来. 将算法的使用与算法的实现分离开来 实现 // 加权映射关系 var levelMap = { S: 10, A: 8, B: 6, C: 4 } ...
- Cinder组件
cinder-api cinder-api 是整个 Cinder 组件的门户,所有 cinder 的请求都首先由 cinder-api 处理. cinder-api 向外界暴露若干 HTTP REST ...
- Kubernetes一键部署利器:kubeadm
要真正发挥容器技术的实力,你就不能仅仅局限于对 Linux 容器本身的钻研和使用. 这些知识更适合作为你的技术储备,以便在需要的时候可以帮你更快的定位问题,并解决问题. 而更深入的学习容器技术的关键在 ...
- 一键分享代码(提供能分享到QQ空间、新浪微博、人人网等的分享功能)
<html> <head></head> <body> <div class="xl_2"> <span styl ...