- 浏览: 7945010 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (2425)
- 软件工程 (75)
- JAVA相关 (662)
- ajax/web相关 (351)
- 数据库相关/oracle (218)
- PHP (147)
- UNIX/LINUX/FREEBSD/solaris (118)
- 音乐探讨 (1)
- 闲话 (11)
- 网络安全等 (21)
- .NET (153)
- ROR和GOG (10)
- [网站分类]4.其他技术区 (181)
- 算法等 (7)
- [随笔分类]SOA (8)
- 收藏区 (71)
- 金融证券 (4)
- [网站分类]5.企业信息化 (3)
- c&c++学习 (1)
- 读书区 (11)
- 其它 (10)
- 收藏夹 (1)
- 设计模式 (1)
- FLEX (14)
- Android (98)
- 软件工程心理学系列 (4)
- HTML5 (6)
- C/C++ (0)
- 数据结构 (0)
- 书评 (3)
- python (17)
- NOSQL (10)
- MYSQL (85)
- java之各类测试 (18)
- nodejs (1)
- JAVA (1)
- neo4j (3)
- VUE (4)
- docker相关 (1)
最新评论
-
xiaobadi:
jacky~~~~~~~~~
推荐两个不错的mybatis GUI生成工具 -
masuweng:
(转)JAVA获得机器码的实现 -
albert0707:
有些扩展名为null
java 7中可以判断文件的contenttype了 -
albert0707:
非常感谢!!!!!!!!!
java 7中可以判断文件的contenttype了 -
zhangle:
https://zhuban.me竹板共享 - 高效便捷的文档 ...
一个不错的网络白板工具
http://www.importnew.com/21235.html
一 前言
很多书上都说,在java的世界里,一切皆对象。其实从某种意义上说,在java中有两种对象:实例对象和Class对象。实例对象就是我们平常定义的一个类的实例:
1
2
3
4
5
6
/**
* Created by aristark on 3/28/16.
*/
public class Person {
}
然后利用new关键字:
1
2
3
4
5
public class Person {
public static void main(String[] args){
Person p = new Person();
}
}
而Class对象是没办法用new关键字得到的,因为它是jvm生成用来保存对应类的信息的,换句话说,当我们定义好一个类文件并编译成.class字节码后,编译器同时为我们创建了一个Class对象并将它保存.class文件中。我不知道这样描述是否妥当,因为我也见过某些书上直接把.class文件称之为Class对象。同时在jvm内部有一个类加载机制,即在需要的时候(懒加载)将.class文件和对应的Class对象加载到内存中。总之要有这样一个意识,Person.java文件编译成Person.class的同时也会产生一个对应的Class对象。
二 Class对象的获得
上面说了,Class对象是jvm用来保存对象实例对象的相关信息的,除此之外,我们完全可以把Class对象看成一般的实例对象,事实上所有的Class对象都是类Class的实例。得到一个实例对象对应的Class对象有以下三种方式:
1.通过实例变量的getClass()方法:
1
2
Dog dog = new Dog();
Class d = dog.getClass();
2.通过类Class的静态方法forName():
1
2
3
4
5
try {
Class dog1 = Class.forName("Dog");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
3.直接给出对象类文件的.class:
1
Class dog2 = Dog.class;
三 Class对象的使用和反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
简而言之,我们可以从.class逆向到.java(反编译),我们可以通过反射机制来访问一个类java对象的属性,方法,甚至我们可以轻易改变一个私有成员,看代码,我们先来定义一个Cat类:
class Cat{
public static int count;
public int age;
private String name;
static {
count = 0;
}
public Cat(){
age = count++;
System.out.println("this is class Cat!");
}
public void run(){
}
private void ruff(){}
}
注意到我们的类中包含静态成员,私有变量,静态初始化以及私有方法。这里在提一下所谓的懒加载:当Cat.java编译成Cat.class文件后并不会立即被加载到内存,而是在它的的静态成员第一次被访问时才被加载(这么看来,Cat的默认构造方法也是静态的!)
Class c = Cat.class;
Field[] fields = c.getDeclaredFields();
for (Field field : fields){
System.out.println(field);
}
结果如下:
public static int Cat.count
public int Cat.age
private java.lang.String Cat.name
可以看到我们轻而易举的得到了Cat类的字段信息,再来:
Method[] methods = c.getDeclaredMethods();
for (Method method : methods){
System.out.println(method);
}
结果如下 :
1
2
public void Cat.run()
private void Cat.ruff()
好玩吧,我们竟然可以在运行时得到类的信息。同时我们发现Cat类中的静态初始化代码段并没有执行。接下来我们通过Class对象来获得对应的实例对象:
try {
Cat cat = (Cat) c.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
这时候静态代码块执行了:
1
this is class Cat!
接下来我们做一件神奇的事情:
try {
Class catClass = Class.forName("Cat");
Field name = catClass.getDeclaredField("name");
name.setAccessible(true);
Cat cat2 = (Cat) catClass.newInstance();
name.set(cat2,"Aristark");
System.out.println(cat2.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
这次我们使用Class.forname()来获取Class对象,它的作用是让jvm查找并加载指定的类,也就是说Cat类的静态代码块会被执行。其次值得注意的是,我们通过Class的几个方法访问了原本不可以被访问的name属性:
this is class Cat!
Aristark
从这个意义上来说,反射机制并不符合OOP的思想,所以我们仅在必要的时候使用这个特性就行了。
四 后记
理解好Class对象不仅能让我们更好的认识一切皆对象这个观点,对之后学习泛型,类型擦除都是很有帮助的,而对于java反射机制我们只需在适当的场合利用它即可。:)关于这两个知识的深入学习稍后我会贴出一些有借鉴意义的文章,大家要关注哦~
一 前言
很多书上都说,在java的世界里,一切皆对象。其实从某种意义上说,在java中有两种对象:实例对象和Class对象。实例对象就是我们平常定义的一个类的实例:
1
2
3
4
5
6
/**
* Created by aristark on 3/28/16.
*/
public class Person {
}
然后利用new关键字:
1
2
3
4
5
public class Person {
public static void main(String[] args){
Person p = new Person();
}
}
而Class对象是没办法用new关键字得到的,因为它是jvm生成用来保存对应类的信息的,换句话说,当我们定义好一个类文件并编译成.class字节码后,编译器同时为我们创建了一个Class对象并将它保存.class文件中。我不知道这样描述是否妥当,因为我也见过某些书上直接把.class文件称之为Class对象。同时在jvm内部有一个类加载机制,即在需要的时候(懒加载)将.class文件和对应的Class对象加载到内存中。总之要有这样一个意识,Person.java文件编译成Person.class的同时也会产生一个对应的Class对象。
二 Class对象的获得
上面说了,Class对象是jvm用来保存对象实例对象的相关信息的,除此之外,我们完全可以把Class对象看成一般的实例对象,事实上所有的Class对象都是类Class的实例。得到一个实例对象对应的Class对象有以下三种方式:
1.通过实例变量的getClass()方法:
1
2
Dog dog = new Dog();
Class d = dog.getClass();
2.通过类Class的静态方法forName():
1
2
3
4
5
try {
Class dog1 = Class.forName("Dog");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
3.直接给出对象类文件的.class:
1
Class dog2 = Dog.class;
三 Class对象的使用和反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
简而言之,我们可以从.class逆向到.java(反编译),我们可以通过反射机制来访问一个类java对象的属性,方法,甚至我们可以轻易改变一个私有成员,看代码,我们先来定义一个Cat类:
class Cat{
public static int count;
public int age;
private String name;
static {
count = 0;
}
public Cat(){
age = count++;
System.out.println("this is class Cat!");
}
public void run(){
}
private void ruff(){}
}
注意到我们的类中包含静态成员,私有变量,静态初始化以及私有方法。这里在提一下所谓的懒加载:当Cat.java编译成Cat.class文件后并不会立即被加载到内存,而是在它的的静态成员第一次被访问时才被加载(这么看来,Cat的默认构造方法也是静态的!)
Class c = Cat.class;
Field[] fields = c.getDeclaredFields();
for (Field field : fields){
System.out.println(field);
}
结果如下:
public static int Cat.count
public int Cat.age
private java.lang.String Cat.name
可以看到我们轻而易举的得到了Cat类的字段信息,再来:
Method[] methods = c.getDeclaredMethods();
for (Method method : methods){
System.out.println(method);
}
结果如下 :
1
2
public void Cat.run()
private void Cat.ruff()
好玩吧,我们竟然可以在运行时得到类的信息。同时我们发现Cat类中的静态初始化代码段并没有执行。接下来我们通过Class对象来获得对应的实例对象:
try {
Cat cat = (Cat) c.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
这时候静态代码块执行了:
1
this is class Cat!
接下来我们做一件神奇的事情:
try {
Class catClass = Class.forName("Cat");
Field name = catClass.getDeclaredField("name");
name.setAccessible(true);
Cat cat2 = (Cat) catClass.newInstance();
name.set(cat2,"Aristark");
System.out.println(cat2.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
这次我们使用Class.forname()来获取Class对象,它的作用是让jvm查找并加载指定的类,也就是说Cat类的静态代码块会被执行。其次值得注意的是,我们通过Class的几个方法访问了原本不可以被访问的name属性:
this is class Cat!
Aristark
从这个意义上来说,反射机制并不符合OOP的思想,所以我们仅在必要的时候使用这个特性就行了。
四 后记
理解好Class对象不仅能让我们更好的认识一切皆对象这个观点,对之后学习泛型,类型擦除都是很有帮助的,而对于java反射机制我们只需在适当的场合利用它即可。:)关于这两个知识的深入学习稍后我会贴出一些有借鉴意义的文章,大家要关注哦~
发表评论
-
复习:强迫线程顺序执行方式
2019-01-03 23:42 1580方法1: 三个线程,t1,t2,t3,如果一定要按顺序执行, ... -
(转)不错的前后端处理异常的方法
2019-01-02 23:16 2020前言 在 Web 开发中, 我们经常会需要处理各种异常, 这是 ... -
info q的极客时间大咖说等资料下载
2018-08-15 08:40 3474info q的极客时间大咖说等资料下载,还有不少思维导图 链 ... -
CXF 客户端超时时间设置(非Spring配置方式)
2018-07-03 22:38 2237import org.apache.cxf.endpoint. ... -
(转)synchronized关键字画像:正确打开方式
2018-06-14 09:25 491https://mp.weixin.qq.com/s/b3Sx ... -
CountDownLatch的例子
2018-06-13 14:10 692public class StatsDemo { ... -
两道面试题,带你解析Java类加载机制
2018-06-12 16:29 612https://mp.weixin.qq.com/s/YTa0 ... -
Spring中获取request的几种方法,及其线程安全性分析
2018-06-11 09:03 672https://mp.weixin.qq.com/s/KeFJ ... -
内部类小结
2018-06-06 10:25 439https://mp.weixin.qq.com/s/hErv ... -
JVM虚拟机小结1
2018-06-04 20:43 5451 jps -l //列出详细的类名和进程ID 2)jps ... -
windows下自带命令行工具查看CPU资源情况等
2018-06-04 12:53 3102微软提供了不少命令行 ... -
(收藏)深入分析Java的序列化与反序列化
2018-05-30 15:21 619https://mp.weixin.qq.com/s/T2Bn ... -
apache common包中的序列化工具
2018-05-30 09:10 1845什么是序列化 我们的 ... -
JAVA8 JVM的变化: 元空间(Metaspace)
2018-05-24 22:30 968本文将会分享至今为至我收集的关于永久代(Permanent G ... -
(转)服务器性能指标(一)——负载(Load)分析及问题排查
2018-05-21 21:03 1364原创: Hollis Hollis 负载 ... -
(转)对象复用
2018-05-20 15:27 864public class Student { priv ... -
mapreduce中入门中要注意的几点
2018-05-06 08:59 675在 mapreduce中,比如有如下的词: I love b ... -
HDFS的基本操作
2018-05-02 21:47 942-mkdir 在HDFS创建目录 ... -
一个不错的开源工具类,专门用来解析日志头部的,好用
2018-05-02 20:00 773一个不错的开源工具类,专门用来解析日志头部的,好用。 http ... -
介绍个不错的RESTFUL MOCK的工具wiremock
2018-04-27 21:02 1908介绍个不错的RESTFUL MOCK的工具wiremock,地 ...
相关推荐
### JAVA反射机制——Class类与Class对象的获取 #### 概述 在Java语言中,反射是一种强大的功能,允许程序在运行时动态地检查和修改自身的行为。这种能力是通过`java.lang.Class`类实现的,它提供了封装类或接口...
`Class`类在Java反射机制中扮演着核心角色,它是所有Java类的运行时表示。`Class`对象可以由以下几种方式获取: 1. **通过类的`Class`属性获取**:如`String.class`。 2. **通过对象的`getClass()`方法获取**:如`...
### Java反射机制详解 ...尽管存在一定的性能和安全性上的问题,但在合理设计和使用的情况下,Java反射机制可以极大地提高软件的开发效率和维护性。开发者在使用反射时应当权衡其利弊,谨慎选择应用场景。
总的来说,Java反射机制和字符串操作是Java开发中不可或缺的部分,它们允许我们实现动态编程,增强程序的灵活性和可扩展性。通过结合XML序列化和解析,我们可以方便地在Java对象和XML数据之间进行转换,这对于数据...
在JAVA反射机制中,Class类和Field类、Method类、Constructor类是最重要的三个类,它们提供了访问类、字段、方法和构造函数的能力。 在获取某个对象的属性时,我们可以使用getField方法,例如: ```java public ...
在给定的“利用java反射将json字符串转成对象”的主题中,我们将深入探讨如何借助反射机制将JSON字符串转换为Java对象。 首先,我们需要了解JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人...
Java反射机制是Java语言提供的一种强大功能,它允许我们在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个机制在处理不确定类型或者需要灵活操作类的场景中非常有用。在这个...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。通过Java反射机制,开发者可以在不知道具体类名的情况下创建对象,调用方法,访问和修改私有成员变量,以及...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段以及方法等对象。这一机制的核心在于`java.lang.Class`类和相关的API,它们提供了对类元数据的访问,使得我们能够在运行时...
Java 反射机制是 Java 语言中的一种强大工具,允许程序在运行时检查和修改对象的行为。下面我们将讨论如何使用 Java 反射机制来打印一个对象的所有属性值。 Java 反射机制的概念 Java 反射机制是指 Java 语言中的...
Java 反射机制详解与应用 Java 反射机制是一种非常强大的动态相关机制,允许 Java...在 Java 程序中,Java 反射机制是非常重要的机制,它提供了非常强大的功能,可以帮助开发者快速地开发和维护复杂的 Java 应用程序。
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者可以动态地获取类的信息并调用其方法,创建对象,访问私有成员,甚至改变类的行为。在深入...
Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法等对象。在"北大青鸟java反射机制"的学习资料中,我们将会深入探讨这一核心特性。 首先,我们要理解反射的核心概念...
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...
Java反射机制是Java编程语言中...总之,Java反射机制是Java语言灵活性的体现,它提供了一种强大的工具,允许程序员在运行时探索和操纵类和对象。但同时,也需注意其潜在的风险和性能影响,合理地在项目中应用反射技术。
Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...
Java反射机制是Java语言提供的一种强大的能力,它允许我们在运行时检查类的信息并动态地创建和操作对象。这种机制使得程序具有更高的灵活性和扩展性,尤其是在框架开发中有着广泛的应用。 首先,我们要理解反射的...
Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者可以动态地创建对象、调用方法、访问字段,甚至修改私有成员,这极大地增强了代码的灵活性...
Java反射机制是Java编程语言中的一个重要特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类集中...在实践中学习,你会更好地理解Java反射机制的威力和应用场景。